2015-08-16 648 views
0

Serializable的默認行爲以獨立於構造函數的特殊方式創建對象。可序列化將默認使用反射來讀取和寫入所有非瞬態非靜態字段。如何在反序列化過程中手動創建自己的對象?

另一方面,Externalizable不使用反射,因此速度更快,但需要你自己去做:這就是我想要的。

在反序列化期間將使用Class.newInstance()。這意味着Externalizable類必須有一個公共的無參數構造函數。

公共無參數構造函數在非靜態最終字段中是不可接受的,有時甚至是不可能的。

隨着一點挖掘,我發現android.os.Parcelable允許我自己創建對象。還有com.hazelcast.nio.serialization.IdentifiedDataSerializable,但是我必須創建一個工廠類並註冊它,與Parcelable相比,它看起來像是很多不必要的工作。

我的代碼不是android,目前不使用庫。所以我有2個問題:

  1. 是否有可能在非android的Java代碼中使用Parcelable?
  2. 什麼是最簡單的方法/影響最小的庫,允許我在反序列化過程中創建並返回自己的對象?圖書館也不會花錢。

是的,我知道序列化代理,但這不是問題的關鍵。

+0

[kryo](https://github.com/EsotericSoftware/kryo)也許?我仍然想知道我的選擇。 – SkySpiral7

+2

那麼究竟是什麼*是問題的要點?序列化似乎完美符合法案。很明顯,對(1)的回答是否定的,因爲Parcelable不是Java的一部分。 – EJP

+0

我想要比Externalizable給我更多的控制。我希望能夠從流中讀取數據並決定調用構造函數或工廠,或者重用已存在的對象等。我知道有readResolve,但我試圖避免將其用於其他原因。 – SkySpiral7

回答

0

其中一個(不可錯過的部分)解決方案是僅在要嘗試序列化的任何對象樹的「根」類上使用Externalizable。它包含的任何字段(包括對象引用的深層副本)都可以通過將ObjectInput傳遞給工廠方法(或傳遞給ObjectInput的構造方法)來進行序列化。這允許除根對象之外的所有變量都是不可變的。

當然,如果對象樹的根對象是不能有無參數構造函數的對象,那麼這將無濟於事。

相關問題