我所理解的JDK序列化

1,什么是序列化?
  Java中的对象存在与JVM中,当JVM关闭后对象就不存在了。为了复用对象,能够将对象表示为一个字节流序列,该字节流序列被反序列化为Java对象时的数据和类型信息与被序列化以前一致。json

2,什么场景须要序列化?
  当前的JVM须要与外接进行交互的场景。好比,使用Redis或MQ或文件存储等持久化Java对象的场景、WebService等跨系统共享对象等场景。工具

3,序列化方法?
一、JDK自身提供了序列化Java对象的方法xml

  • 对象须要实现Serializable接口,该接口没有任何须要重写的方法。生成private static final long serialVersionUID。若是serialVersionUID不相同,为了防止反序列化对虚拟机形成伤害,反序列化错。
  • 被transient关键字修饰的属性是不参与序化。
  • 若是对象中有 private void writeObject(ObjectOutputStream out) 或者 private void readObject(ObjectInputStream in)的话,Serializable接口会调用该方法进行序列化与反序化。
  • transient关键字、writeObject()、readObject()都是在对象实现Serializable接口的状况下效。
  • 对象实现Externalizable接口,重写writeExternal(ObjectOutput out) 和 readExternal(ObjectInput in)方法来更灵活的实现序列化与反序列化。

二、JSON形式的序列化
  可使用Alibaba提供的FastJson或者Google的gson来将对象序列化为json字符串进行传输(xml字符串也能够)。特色是很直观。对象

三、Google protostuff
  Google出品,比较强大,推荐使用。支持序列化的ClassA和反序列化的ClassB能够是不一样的包路径和类名,支持先后相同属性名的类型能够不一样(好比int转long)。参见 http://www.protostuff.io/
  特色是灵活、跨语言、效率高。接口

四、其余工具,如 Kryo、Hessian等字符串

注意get

  1. Serializable接口反序列化时类的全路径必须相同。
  2. 父类实现了Serializable接口,子类能够不实现,但建议子类要拥有本身的serialVersionUID。
  3. 当一个对象的实例变量引用了其余对象,被引用的对象也会序列化。
  4. 反序列化不会改变当前JVM类的静态变量的值。

参考资料:虚拟机

  1. 以上内容为笔者平常琐屑积累,已无从考究引用。若是有,请站内信提示。
相关文章
相关标签/搜索