如何在反序列化期间手动创建自己的对象?

时间:2015-08-16 01:32:31

标签: java deserialization

Serializable的默认行为以独立于构造函数的特殊方式创建对象。 Serializable默认使用反射来读取和写入所有非瞬态非静态字段。

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

  

在反序列化期间,将使用Class.newInstance()。这意味着Externalizable类必须具有公共的无参数构造函数。

公共无参数构造函数是不可接受的,有时甚至不可能在非静态最终字段的情况下。

通过一些挖掘,我找到了android.os.Parcelable,它允许我自己创建对象。还有com.hazelcast.nio.serialization.IdentifiedDataSerializable但是我必须创建一个工厂类并注册它,与Parcelable相比,它看起来像是一些不必要的工作。

我的代码不是android,目前不使用库。所以我有两个问题:

  1. 是否可以在非Android Java代码中使用Parcelable?
  2. 允许我在反序列化期间创建和返回自己的对象的最简单方法/最低影响库是什么?图书馆也不能花钱。
  3. 是的,我知道序列化代理,但这不是问题的重点。

1 个答案:

答案 0 :(得分:0)

一个(公认的部分)解决方案是仅在" root"上使用Externalizable。您尝试序列化的任何对象树的类。它包含的任何字段(包括对象引用的深层副本)都可以通过将ObjectInput传递给工厂方法(或者传递给ObjectInput的构造函数)来序列化。这允许除根对象之外的所有对象都是不可变的。

当然,如果对象树的根对象是不能具有无参数构造函数的对象,那么这将无济于事。