Java序列化——JDK序列化与Json序列化

Java原生序列化
Java原生序列化我们可能会了解的比较多,Java类通过实现Serializable接口来实现该类对象的序列化,这个接口非常特殊,没有任何方法,只起标识作用。Java序列化保留了对象类的元数据(如类、成员变量、继承类信息),以及对象数据等,兼容性最好,但不支持跨语言,而且性能一般。

下面我们来写一个简单的例子

public class User implements Serializable {

    private String username;
    private String sex;
    private Integer age;

    public User(){}

    public User(String username, String sex, Integer age) {
        this.username = username;
        this.sex = sex;
        this.age = age;
    }
    
    ......get、set、toString方法略
}
public class UserTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        File file = new File("D:/user.out");
        //java序列化
        try (OutputStream out = new FileOutputStream(file);
             ObjectOutputStream outputStream = new ObjectOutputStream(out)) {
            User user = new User("Tom", "man", 20);
            outputStream.writeObject(user);
        }

        //反序列化
        try (InputStream input = new FileInputStream(file);
             ObjectInputStream inputStream = new ObjectInputStream(input)) {
            User user1 = (User) inputStream.readObject();
            System.out.println(user1);
        }
    }
}
User{username='Tom', sex='man', age=20}

实现Serializable接口的类建议设置serialVersionUID字段值,如果不设置,那么每次运行时,编译器都会根据类的内部实现,包括类名,接口名,方法和属性等来自动生成serialVersionUID。如果类的源代码有修改,那么重新编译后的serialVersionUID的取值可能会发生改变,因此,实现Serializable接口的类一定要显示的定义serialVersionUID属性值。修改类时需要根据兼容性决定是否修改serialVersionUID值:

如果是兼容升级,请不要修改serialVersionUID字段,避免反序列化失败。
如果是不兼容升级,需要修改serialVersionUID值,避免反序列化混乱。
使用Java原生序列化需要注意,Java反序列化时不会调用类的无参构造方法,而时调用native方法将成员变量赋值为对应类型的初始值。基于性能及兼容性考虑,不建议使用Java原生序列化。
 

Json序列化

​ Json是一种轻量级的数据交换格式,Json序列化就是将数据对象转换成Json字符串,在序列化过程中抛弃了类型信息,所以反序列化时只有提供类型信息才能准确的反序列化。相比前两种方式,JSON可读性比较好,方便调试。

下面看一个例子:

    public static void main(String[] args) throws IOException {
        Student student = new Student();
        student.setName("Amy");
        student.setStu_id("1001");
        //序列化
        String jsonStr = JSON.toJSONString(student);
		//反序列化
        Student stu = JSON.parseObject(jsonStr, Student.class);
        System.out.println(stu);
    }
Student{name='Amy', stu_id='1001'}

如果不想某个敏感字段参与序列化,那么可以加transient关键字,避免把此属性信息转化为序列化的二进制流。

你可能感兴趣的:(java,开发语言)