我不确定我是否理解java中的序列化是如何工作的

时间:2011-09-19 12:56:34

标签: java serializable

我知道它只是保存了一个对象的状态,但是我应该在哪些类中实现这个接口?

例如,假设您有4个类A,B,C,D:

abstract class A { ... }
class B extends A { ... }
class C extends A { ... }

D是创建和操作AB的对象的类:

class D { A a; B b; ... }

如果我想存储程序的状态,我应该说只在D和A类中实现Serializable接口吗?

还假设正在使用此class E来帮助D中的某些计算。

E还应该实施Serializable吗?它对我来说似乎不正确,因为它只是一个有助于计算的类,它不存储需要在以后状态下知道的任何有价值的东西。

3 个答案:

答案 0 :(得分:1)

仅序列化包含您需要的数据的内容。在这种情况下,A似乎是可能的候选人。

我不会序列化D,因为它只是一个持久化对象的聚合...我会允许一个方法让我检索一个数组中的A及其子项(getData())的所有实例或者让我的东西存储一切。然后另一种让我用A数组重建D的方法。

此外,由于E不保存任何数据,因此不需要序列化(没有任何需要持久化的运行时数据)。

B和C将从A继承序列化。

问问自己,如果我重新开启我的应用程序,当我重新打开它时,我想要的数据是什么。尽量让你的序列化对象尽可能轻量级,让你的生活更轻松。

答案 1 :(得分:0)

序列化的想法是您希望稍后或在不同的计算机上重新创建实例。也许有必要考虑我们需要重新创建什么,可以在本地创建什么。

abstract class A implements Serializable { private int a; }
abstract class B extends A { private int b; B(int b) { this.b=b;} }
abstract class C extends A { private int c; C(int c) { this.c=c;} }

这允许序列化/反序列化B和C的实例。

class D implements Serializable {
   B someB;
   C someC;
   D(int b, int c) {
     someB = new B(b);
     someC = new C(c);
   }
}

在这种情况下,D必须可序列化,因为我们想要一个D实例具有完全相同的B和C对象。

如果E只提供方法,那么我们可能不需要序列化它 - 除非D引用E的实例,我们需要它来重新创建有效的D实例

答案 2 :(得分:-1)

您打算序列化的每个对象都应该实现Serializable接口。在你的A类和D类需要实现它。您无需序列化E,因为它没有任何状态。

通常所有持有你的状态的类(粗略地说有任何实例级变量)都应该直接或间接地实现Serializable,如果它们要被序列化的话。