簡體   English   中英

如何在反序列化期間手動創建自己的對象?

[英]How can I manually create my own object during deserialization?

Serializable的默認行為以獨立於構造函數的特殊方式創建對象。 可序列化默認情況下將使用反射來讀取和寫入所有非瞬態非靜態字段。

另一方面,可外部化不使用反射,因此速度更快,但是需要您自己執行操作:這就是我想要的。

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

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

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

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

  1. 是否可以在非Android Java代碼中使用Parcelable?
  2. 什么是最簡單的方法/影響最小的庫,它將允許我在反序列化期間創建和返回自己的對象? 圖書館也不花錢。

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

一種(公認的局部)解決方案是僅在要序列化的任何對象樹的“根”類上都具有Externalizable。 可以通過將ObjectInput傳遞到工廠方法(或傳遞給采用ObjectInput的構造函數)來序列化包含它的任何字段(包括對象引用的深層副本)。 這允許除根對象之外的所有對象都是不可變的,等等。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM