我知道它只是保存了一个对象的状态,但是我应该在哪些类中实现这个接口?
例如,假设您有4个类A,B,C,D:
abstract class A { ... }
class B extends A { ... }
class C extends A { ... }
D
是创建和操作A
和B
的对象的类:
class D { A a; B b; ... }
如果我想存储程序的状态,我应该说只在D和A类中实现Serializable
接口吗?
还假设正在使用此class E
来帮助D
中的某些计算。
E
还应该实施Serializable
吗?它对我来说似乎不正确,因为它只是一个有助于计算的类,它不存储需要在以后状态下知道的任何有价值的东西。
答案 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,如果它们要被序列化的话。