Java 在构造时反序列化

Java 在构造时反序列化,java,Java,我有一个类实现了Serializable。我有一个自己序列化的方法: ... fos = new FileOutputStream(path); out = new ObjectOutputStream(fos); out.writeObject(this); ... 我想在调用构造函数时反序列化它。可能吗?我试过几种方法,但都不管用 例如,我尝试过: ... fis = new FileInputStream(path); in = new ObjectInputStream(fis);

我有一个类实现了
Serializable
。我有一个自己序列化的方法:

...
fos = new FileOutputStream(path);
out = new ObjectOutputStream(fos);
out.writeObject(this);  
...
我想在调用构造函数时反序列化它。可能吗?我试过几种方法,但都不管用

例如,我尝试过:

...
fis = new FileInputStream(path);
in = new ObjectInputStream(fis);
this = (MySerializableClass)in.readObject();
...

但是,当然,
这个
不是一个可以这样分配的变量…

您不能这样做,但是您可以反序列化相同类型的对象,并将所有值复制到当前对象


一种常见的方法是不序列化对象本身,而是重新加载它所需的所有数据。

您不能这样做,但可以反序列化相同类型的对象,并将所有值复制到当前对象


一种常见的方法是不序列化对象本身,而是重新加载它所需的所有数据。

非序列化的主要概念是它从不调用
构造函数,而是手动将值从
steam
复制到对象

当可序列化的
类的实例被反序列化时,
构造函数
不会运行,并且
实例变量
未给出其最初指定的值


构造函数中的反序列化是不可能的。

反序列化的主要概念是它从不调用
构造函数
,而是手动将值从
蒸汽
复制到对象

当可序列化的
类的实例被反序列化时,
构造函数
不会运行,并且
实例变量
未给出其最初指定的值


构造函数中的反序列化是不可能的。

如何将
分配给
(双[])

您不能这样做,但是您可以在构造函数中为对象的字段赋值,您可以使用相同的方法,例如
readObject()
readInt()

e、 g


如何将此
分配给
(double[])

您不能这样做,但是您可以在构造函数中为对象的字段赋值,您可以使用相同的方法,例如
readObject()
readInt()

e、 g


序列化机制通常绕过构造函数。如果需要调用构造函数,可以使用。本文简要地强调了可序列化和可外部化之间的区别:

序列化机制通常绕过构造函数。如果需要调用构造函数,可以使用。这篇文章很快强调了可序列化和可外部化之间的区别:

处理这种情况的一种常见方法是创建工厂类型的静态方法来返回类的实例(通过序列化),而不是尝试通过构造函数来实现……因此,您的客户机代码将执行以下操作

MySerializableClass myClass = MySerializableClass.Create(path);

(其中Create是您的静态方法)

处理此场景的常见方法是创建工厂类型的静态方法以返回类的实例(通过序列化),而不是尝试通过构造函数执行此操作…因此您的客户端代码将执行以下操作

MySerializableClass myClass = MySerializableClass.Create(path);

(Create是您的静态方法)

您能详细说明为什么序列化对象本身并不常见吗?我不明白你的意思。谢谢。如果您是从外部序列化对象,您会序列化该对象,因为您还希望反序列化该对象。如果对象正在序列化或反序列化自身,它将只序列化自己的字段。您能否详细说明为什么序列化对象本身并不常见?我不明白你的意思。谢谢。如果您是从外部序列化对象,您会序列化该对象,因为您还希望反序列化该对象。如果对象正在序列化或反序列化自身,它只会序列化它自己的字段。但我必须将整个对象反序列化为辅助对象,然后复制它的字段,对吗?如下所示:
MySerializableClass aux=(MySerializableClass)in.readObject()
this.field1=aux.field1
您假设我的类是一个
双[]
的方式。不,反序列化后不需要它,只要它不包含任何不可序列化的成员,它将具有分配给它的所有字段值。因此,.readObject()中的MySerializableClass aux=(MySerializableClass)是你需要做的,不需要使用构造函数,那么
aux
对象将被赋值。但是我必须将整个对象反序列化为辅助对象,然后复制它的字段,对吗?如下所示:
MySerializableClass aux=(MySerializableClass)in.readObject()
this.field1=aux.field1
您假设我的类是一个
双[]
的方式。不,反序列化后不需要它,只要它不包含任何不可序列化的成员,它将具有分配给它的所有字段值。因此,.readObject()中的MySerializableClass aux=(MySerializableClass)
是您需要做的,不需要使用构造函数,那么
aux
对象将被分配值。您的意思是我只能从序列化类实例化的位置取消序列化吗?不,您可以从类中除构造函数之外的任何位置读取流,然后对其进行强制转换。您的意思是我只能从可序列化类实例化的位置取消序列化吗?不,您可以从类中除构造函数之外的任何位置读取流,然后对其进行强制转换。是的,最后我通过静态方法而不是构造函数来执行此操作。但与您的解决方案完全不同。它从客户端被调用为:
MySerializableClass myClass=new MySerializableClass();创建(路径)那不是一个静态方法,那是一个实例方法。是的,最后我通过一个静态方法而不是constr