Java 反序列化时未调用构造函数
我不确定在其他语言中是否也会发生这种情况。但是我真的很想知道当我们反序列化一个对象时,类的构造函数没有被调用的确切原因。原因很简单,为什么Java中的反序列化不使用构造函数:它的全部目的是让一个对象处于与序列化时完全相同的状态。构造函数中的操作可能会改变这种状态。原因很简单,为什么Java中的反序列化不使用构造函数:它的全部目的是使对象处于与序列化时完全相同的状态。构造函数中的操作可能会改变该状态。构造函数用于初始化对象的状态。反序列化对象已处于初始化状态。反序列化只应重新构成旧状态。因此,不再执行构造函数代码 执行构造函数代码,然后通过反序列化重写状态也是没有意义的 有一个内部类允许这样做(在不执行conostructor代码的情况下创建实例)。该类也被类似于powermock的模拟框架使用 我正在学习的课程名为Java 反序列化时未调用构造函数,java,serialization,Java,Serialization,我不确定在其他语言中是否也会发生这种情况。但是我真的很想知道当我们反序列化一个对象时,类的构造函数没有被调用的确切原因。原因很简单,为什么Java中的反序列化不使用构造函数:它的全部目的是让一个对象处于与序列化时完全相同的状态。构造函数中的操作可能会改变这种状态。原因很简单,为什么Java中的反序列化不使用构造函数:它的全部目的是使对象处于与序列化时完全相同的状态。构造函数中的操作可能会改变该状态。构造函数用于初始化对象的状态。反序列化对象已处于初始化状态。反序列化只应重新构成旧状态。因此,不再
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标记,因为它在对象序列化规范中是这么说的。