对 java对象的传输 是通过网络的 。然后网络都是通过字节传输的 所以需要用序列化的方式 将java对象转化为 字节,然后网络那头的接受端,拿到收到的字节 再反序列化出来一个对象,用来保证 java的对象能够跨进程传输。
总结了一下 序列化的几个要点: 1.在java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化 2.通过ObjectOutputStream和ObjectInputStream对对象进行序列化合反序列化操作 3. 对象是否允许被反序列化,不仅仅是取决于对象的代码是否一致,同时还有一个重要的因素(UID) 4. 序列化不保存静态变量 5. 要想父类对象也参与序列化操作,那么必须要让父类也实现Serializable接口 6. Transient关键字,主要是控制变量是否能够被序列化。如果没有被序列化的成员变量反序列化后,会被设置成初始值,比如String -> null 7. 通过序列化操作实现深度克隆
主流的序列化技术有: JSON/Hessian(2) /xml/protobuf/kryo/MsgPack/FST/thrift/protostuff/Avro
其中常用的是 JSON 但性能最好的是 百度的jprotobuf 百度对Google的 protobuf 进行了封装。 dubbo 使用的是Hessian2 序列化的速度很快 但是字节很大 jprotobuf 序列化的速度稍微慢点,但字节很小。
这两点就是选择不同序列化技术的原因所在。