Java序列化和反序列化

序列化和反序列化的定义

* Java序列化就是指把Java对象转换为字节序列的过程
* Java反序列化就是指把字节序列恢复为Java对象的过程。

 

以下是我们常见的一行代码:

private static final long serialVersionUID = 1L;

关于这行代码,这是java源码中的一段话:

如果可序列化类没有显式声明 serialVersionUID,那么序列化运行时将根据类的各个方面计算该类的默认serialVersionUID值,如Java对象序列化规范中所述。

此规范将枚举类型的seriaversionUID定义为0L。但是。强烈建议除枚举类型之外的所有可序列化类都显式声明 serialVersionUID 值,
因为默认的 serialVersionUID 计算对类细节非常敏感,这些细节可能因编译器实现而有所不同。

因此在反序列化过程中可能会导致意外的InvalidClassException。因此,为了保证不同iava编怪器实现中的serlalVersionUID值一致。
可序列化类必须声明显式 serialVersionUID 值。
强烈建议显示serialVersionuID声明尽可能使用私有修符。因为此声明仅适用于当前类,serialVersionUID 字段作为继承成员没有用处。

这是一个 Java 语言中关于序列化版本UID的常量声明。 这个值是用于标识 Java 对象的序列化版本。 当一个对象被序列化时,版本 UID 会被写入序列化的数据流中并被用于反序列化时的版本检查。 如果反序列化的对象的版本 UID 与序列化时的版本 UID 不一致,那么反序列化会失败,抛出 InvalidClassException 异常。

为了避免这种情况,开发者可以指定 serialVersionUID,以便在类的改动发生时,显式的指定序列化版本号;这样就可以保证当对象序列化的版本号和反序列化的版本号一直时,即使类的内部改动,依然能够反序列化成功。这是Java中,Serializable接口实现的一部分。

总结: 在使用 Java 自带的序列化机制时,需要显式地指定 serialVersionUID 以确保版本兼容性。

 

其他序列化工具

  • fastJson 

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。fastJson 底层并不使用 ObjectInputStream 进行对象的反序列化,它使用的是自己实现的反序列化机制。

当 fastJson 将 Java 对象转化为 JSON 字符串时,它会根据对象的属性、类型等信息来构造一个对应的 JSON 对象。而当 fastJson 将 JSON 字符串转化为 Java 对象时,它会先将 JSON 解析为一个 JSONObject,并使用反射获取 Java 类的信息,然后再根据 Java 类的属性、类型等信息来构造对应的 Java 对象。

  • Jackson

jackson(springboot默认的序列化工具),jackson底层采用的是ObjectMapper技术进行序列化以及反序列化的。

Tips:在使用这些序列化工具时,是不需要显式地指定 serialVersionUID。

posted @ 2023-05-25 12:42  danielzzz  阅读(63)  评论(0编辑  收藏  举报