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

Java 反序列化时未调用构造函数,java,serialization,Java,Serialization,我不确定在其他语言中是否也会发生这种情况。但是我真的很想知道当我们反序列化一个对象时,类的构造函数没有被调用的确切原因。原因很简单,为什么Java中的反序列化不使用构造函数:它的全部目的是让一个对象处于与序列化时完全相同的状态。构造函数中的操作可能会改变这种状态。原因很简单,为什么Java中的反序列化不使用构造函数:它的全部目的是使对象处于与序列化时完全相同的状态。构造函数中的操作可能会改变该状态。构造函数用于初始化对象的状态。反序列化对象已处于初始化状态。反序列化只应重新构成旧状态。因此,不再

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

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

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

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

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

有一个内部类允许这样做(在不执行conostructor代码的情况下创建实例)。该类也被类似于powermock的模拟框架使用

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


像objenesis这样的框架使用它们。请看下面的图片。因此,如果您想使用这种功能,我将使用objeness。

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

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

有一个内部类允许这样做(在不执行conostructor代码的情况下创建实例)。该类也被类似于powermock的模拟框架使用

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


像objenesis这样的框架使用它们。请看下面的图片。因此,如果你想使用这样的功能,我会使用objeness。

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

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
正在从字节流构造对象

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

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
正在从字节流构造对象

这意味着我们可以使用新操作符创建对象,而不需要构造函数?如果我们知道classIt不是那么容易,只写“new…”而不执行构造函数代码,但是jvm中有一个类可以做到这一点。我正在搜索它,然后更新我的答案。@KevinBowersox与JPA没有真正的关系。JPA也使用序列化,问题是。@RenéLink或OP可能只是把它放错了地方tag@MateuszDymczyk我同意你的看法。这意味着我们可以用新操作符创建对象,而不需要构造函数?如果我们知道classIt不是那么容易,只写“new…”而不执行构造函数代码,但是jvm中有一个类可以做到这一点。我正在搜索它,然后更新我的答案。@KevinBowersox与JPA没有真正的关系。JPA也使用序列化,问题是。@RenéLink或OP可能只是把它放错了地方tag@MateuszDymczyk我同意你的看法。@KevinBowersox。我删除了JPA标记。因为它在对象序列化规范中是这么说的。@KevinBowersox。我删除了JPA标记,因为它在对象序列化规范中是这么说的。