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
- Serializable接口反序列化时类的全路径必须相同。
- 父类实现了Serializable接口,子类能够不实现,但建议子类要拥有本身的serialVersionUID。
- 当一个对象的实例变量引用了其余对象,被引用的对象也会序列化。
- 反序列化不会改变当前JVM类的静态变量的值。
参考资料:虚拟机
- 以上内容为笔者平常琐屑积累,已无从考究引用。若是有,请站内信提示。