- 序列化:将数据结构或对象转换成可以存储或传输的形式,通常是二进制字节流,也可以是 JSON, XML 等文本格式
- 反序列化:将在序列化过程中所生成的数据转换为原始数据结构或者对象的过程
下面是序列化和反序列化常见应用场景:
- 对象在进行网络传输(比如远程方法调用 RPC 的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;
- 将对象存储到文件之前需要进行序列化,将对象从文件中读取出来需要进行反序列化;
- 将对象存储到数据库(如 Redis)之前需要用到序列化,将对象从缓存数据库中读取出来需要反序列化;
- 将对象存储到内存之前需要进行序列化,从内存中读取出来之后需要进行反序列化。
JDK 自带的序列化方式一般不会用 ,因为序列化效率低并且存在安全问题。比较常用的序列化协议有 Hessian、Kryo、Protobuf、ProtoStuff,这些都是基于二进制的序列化协议。
像 JSON 和 XML 这种属于文本类序列化方式。虽然可读性比较好,但是性能较差,一般不会选择。
serialVersionUID 有什么作用?
序列化号 属于版本控制的作用。反序列化时,会检查 是否和当前类的 一致。如果 不一致则会抛出 异常。强烈推荐每个序列化类都手动指定其 ,如果不手动指定,那么编译器会动态生成默认的 。
serialVersionUID 不是被 static 变量修饰了吗?为什么还会被“序列化”?
修饰的变量是静态变量,属于类而非类的实例,本身是不会被序列化的。然而, 是一个特例, 的序列化做了特殊处理。当一个对象被序列化时, 会被写入到序列化的二进制流中;在反序列化时,也会解析它并做一致性判断,以此来验证序列化对象的版本一致性。如果两者不匹配,反序列化过程将抛出 ,因为这通常意味着序列化的类的定义已经发生了更改,可能不再兼容
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/6349.html