反序列化时未调用构造函数

时间:2013-10-24 12:58:12

标签: java serialization

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

3 个答案:

答案 0 :(得分:3)

构造函数用于初始化对象的状态。反序列化对象已处于初始化状态。反序列化只应重新构成旧的状态。因此,构造函数代码不再执行。

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

有一个内部类允许这个(创建一个实例而不执行conostructor代码)。那个类也被像powermock这样的模拟框架使用。

我正在考虑的课程名为sun.reflect.ReflectionFactory。该类有一个名为newConstructorForSerialization()的方法。

像objenesis这样的框架使用它们。看看package summary。因此,如果你想使用这样的功能,我会使用objenesis。

答案 1 :(得分:1)

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

答案 2 :(得分: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正在从字节流构造对象。