美文网首页
Java 序列化

Java 序列化

作者: Tinyspot | 来源:发表于2022-08-28 07:47 被阅读0次

1. Java 原生序列化

  • 序列化:把内存中数据写入文件中
  • 反序列化:从文件中读取数据到内存中
  • 使用流传输对象的过程称为序列化、反序列化

2. 序列化使用

// 必须实现 Serializable 接口,否则会报错 java.io.NotSerializableException
public class Student implements Serializable {
    // 序列化版本号,保证序列化和反序列化的是同一个类
    private static final long serialVersionUID = -3881208742057626511L;
}

    // 序列化
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("src/main/resources/student.bin"));
    Student student = new Student("tinyspot", 20);
    out.writeObject(student);
    out.close();

    // 反序列化
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src/main/resources/student.bin"));
    Student student = (Student) ois.readObject();
    ois.close();
    System.out.println(JSON.toJSONString(student));

2.1 绕过 transient

会通过反射调用 readObject(java.io.ObjectInputStream s) 和 writeObject(java.io.ObjectOutputStream s)

public class User implements Serializable {
    private static final long serialVersionUID = -5324601100478775753L;
    private transient String name;
    private Integer age;

    private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException {
        s.defaultReadObject();
        s.readObject();
    }

    private void writeObject(java.io.ObjectOutputStream s) throws IOException {
        s.defaultWriteObject();
        s.writeObject(name);
    }
}

3. 示例

public static void main(String[] args) {
    ISerializer serializer = new FileSerializer();
    User user = new User("Tinyspot", 20);
    serializer.serializer(user);

    User result = serializer.deSerializer(null, null);
    System.out.println(result);
}
public interface ISerializer {
    
    <T> byte[] serializer(T obj);

    <T> T deSerializer(byte[] data, Class<T> clazz);
}
public class JavaSerialier implements ISerializer {

    @Override
    public <T> byte[] serializer(T obj) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try {
            ObjectOutputStream outputStream = new ObjectOutputStream(byteArrayOutputStream);
            outputStream.writeObject(obj);
            return byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new byte[0];
    }

    @Override
    public <T> T deSerializer(byte[] data, Class<T> clazz) {
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
        try {
            ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream);
            return (T) inputStream.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}
public class FileSerializer implements ISerializer {
    @Override
    public <T> byte[] serializer(T obj) {
        try {
            ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(new File("src/main/resources/user")));
            outputStream.writeObject(obj);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new byte[0];
    }

    @Override
    public <T> T deSerializer(byte[] data, Class<T> clazz) {
        try {
            ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(new File("src/main/resources/user")));
            return (T) inputStream.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

相关文章

  • Java-序列化-反序列化

    Thanks Java基础学习总结——Java对象的序列化和反序列化java序列化反序列化原理Java 序列化的高...

  • java序列化那些事儿

    java序列化作用 在说java序列化的作用之前,先说下什么是java序列化吧。java序列化是指把java对象转...

  • Java序列化

    Java序列化的几种方式以及序列化的作用 Java基础学习总结——Java对象的序列化和反序列化

  • Java序列化机制

    Java序列化机制 序列化和反序列化 Java序列化是Java内建的数据(对象)持久化机制,通过序列化可以将运行时...

  • Java 序列化 之 单例模式

    序列化相关文章: Java 序列化 之 Serializable Java 序列化之 Externalizable...

  • java 序列化 原理解析

    序列化相关文章: Java 序列化 之 Serializable Java 序列化之 Externalizable...

  • 认识Java序列化

    我的个人博客,认识Java序列化 引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java ...

  • JDK 序列化

    序列化和分序列化概念 什么是序列化和反序列化 Java序列化是指把Java对象转换为字节序列的过程,而Java反序...

  • Spark序列化

    Java序列化 有关Java对象的序列化和反序列化也算是Java基础的一部分,首先对Java序列化的机制和原理进行...

  • Serializable中为什么要设置UID

    1、什么是Java序列化与反序列化 Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指...

网友评论

      本文标题:Java 序列化

      本文链接:https://www.haomeiwen.com/subject/wqjvvltx.html