0

我有一个实现Serializable. 我有一个方法可以序列化自己:

...
fos = new FileOutputStream(path);
out = new ObjectOutputStream(fos);
out.writeObject(this);  
...

我想在调用构造函数时反序列化它。那可能吗?我尝试了几件事,但没有奏效。

例如,我尝试过:

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

但是,当然,this不是你可以这样分配的变量......

4

5 回答 5

3

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

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

于 2012-09-06T07:43:44.780 回答
1

序列化机制通常绕过构造函数。如果您需要调用构造函数,则可以改用Externalizable。本文简短地强调了 Serializable 和 Externalizable 之间的区别:http: //javapapers.com/core-java/externalizable-vs-serializable/

于 2012-09-06T07:55:15.317 回答
0

的主要概念UnSerializaion是它从不调用,Constructor而是您手动将值从steam.

当一个serializable类的实例被反序列化时,constructor它不会运行,并且instance variables 不会被赋予它们最初分配的值。

无法在构造函数中进行反序列化。

于 2012-09-06T07:46:47.593 回答
0

你怎么能分配this(double[])

你不能这样做但是你可以在构造函数中将值分配给对象的字段你可以使用相同的方法,即。readObject()readInt()等等。

例如

this.doubleArray = (double[])in.readObject();
于 2012-09-06T07:46:58.693 回答
0

处理这种情况的一种常见方法是创建一个工厂类型的静态方法来返回类的实例(通过序列化),而不是尝试通过构造函数来实现......所以您的客户端代码会执行类似......

MySerializableClass myClass = MySerializableClass.Create(path);

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

于 2012-09-07T03:28:31.120 回答