0

我不确定在其他语言中是否也会发生这种情况。但是我真的很想知道当我们反序列化一个对象时为什么不调用类的构造函数的确切原因。

4

3 回答 3

3

构造函数旨在初始化对象的状态。反序列化的对象已经处于初始化状态。反序列化应该只重建那个旧状态。因此不再执行构造函数代码。

执行构造函数代码然后通过反序列化覆盖状态也是没有意义的。

有一个内部类允许这样做(创建一个实例而不执行构造函数代码)。该类也被 powermock 等模拟框架使用。

我正在学习的课程名为sun.reflect.ReflectionFactory. 这个类有一个方法叫做newConstructorForSerialization().

像 objenesis 这样的框架使用它们。看看包装摘要。所以如果你想使用这样的功能,我会使用 objenesis。

于 2013-10-24T13:03:05.523 回答
1

Java 中的反序列化不使用构造函数的原因很简单:它的全部目的是让对象处于与序列化时完全相同的状态。构造函数中的操作可能会改变该状态。

于 2013-10-24T13:02:07.523 回答
0

序列化是一种创建对象的额外语言方式。而反序列化它只需要从字节流中设置成员变量值。所以需要构造函数调用,因为反序列化本身是在构造对象而不是构造函数。

public class MyClass implements Serializable
{
private  final static long serialVersionUID = 130942892839284932L;   


    private transient String name;
    private transient int count;
    private String firstName;

    private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException
        {
            System.out.println("readObject!!!!");
            objectInputStream.defaultReadObject();
            count = objectInputStream.readInt();
            name = (String)objectInputStream.readObject();
        }
}

就像这里readObject从字节流构造对象一样。

于 2013-10-24T13:04:04.583 回答