爲什麼會要序列化

對 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 序列化的速度稍微慢點,但字節很小。

這兩點就是選擇不同序列化技術的原因所在。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章