Serializable的默認行爲以獨立於構造函數的特殊方式創建對象。可序列化將默認使用反射來讀取和寫入所有非瞬態非靜態字段。如何在反序列化過程中手動創建自己的對象?
另一方面,Externalizable不使用反射,因此速度更快,但需要你自己去做:這就是我想要的。
在反序列化期間將使用Class.newInstance()。這意味着Externalizable類必須有一個公共的無參數構造函數。
公共無參數構造函數在非靜態最終字段中是不可接受的,有時甚至是不可能的。
隨着一點挖掘,我發現android.os.Parcelable允許我自己創建對象。還有com.hazelcast.nio.serialization.IdentifiedDataSerializable,但是我必須創建一個工廠類並註冊它,與Parcelable相比,它看起來像是很多不必要的工作。
我的代碼不是android,目前不使用庫。所以我有2個問題:
- 是否有可能在非android的Java代碼中使用Parcelable?
- 什麼是最簡單的方法/影響最小的庫,允許我在反序列化過程中創建並返回自己的對象?圖書館也不會花錢。
是的,我知道序列化代理,但這不是問題的關鍵。
[kryo](https://github.com/EsotericSoftware/kryo)也許?我仍然想知道我的選擇。 – SkySpiral7
那麼究竟是什麼*是問題的要點?序列化似乎完美符合法案。很明顯,對(1)的回答是否定的,因爲Parcelable不是Java的一部分。 – EJP
我想要比Externalizable給我更多的控制。我希望能夠從流中讀取數據並決定調用構造函數或工廠,或者重用已存在的對象等。我知道有readResolve,但我試圖避免將其用於其他原因。 – SkySpiral7