我想通过套接字发送一个对象,所以我必须实现Serializable。但是我的类是一个复合类,就像这个简单的代码:
class B{
private int a;
public B(int aa){a=aa;}
}
class A {
private B b;
public A(B b1){ b=b1;}
}
我想发送一个A类对象,其中包含所有内容,例如B对象。哪些类应该实现Serializable?只是A,或A和B两者?
另外:矢量怎么样?认为我在A中有一个B向量:
class A {
private Vector bvector;
}
答案 0 :(得分:3)
两者。只要A
具有类型为B
的非静态成员且1)变量b
未标记为transient
或2)class {{B
,{{1}}就无法序列化1}}没有实现Serializable。
答案 1 :(得分:2)
如果这两个类都不是内部类,你可以这样做。在许多情况下更简单,可以独立地序列化。但它通常更快,更依赖于版本,以序列化A,而不是B,包括在A的序列化中重新创建B所需的信息。
如果其中一个或两个都是内部类,那么序列化它们会变得更加混乱/更慢,并且最好将它们的娱乐信息包含在外部类中。
当然,当从多个其他对象引用类的对象时,您通常别无选择,只能将它们单独序列化。
答案 2 :(得分:1)
如果您不能使B序列化,您将获得序列化异常。
答案 3 :(得分:1)
您可以序列化A的实例,即使B未声明为Serializable
。对此的要求是
A类必须提供以下方法的实现:
private void readObject(ObjectInputStream ois)
private void writeObject(ObjectOutputStream oos)
如果声明B类,则序列化A的实例肯定更容易
Serializable
如果不是Vector
。如果允许,可以使默认序列化起作用。
拥有{{1}}的B在上述情况下没有任何区别(它只是添加了另一层结构)。
答案 4 :(得分:0)
你可以有一个包装类序列化Vector,前提是它是另一个Serializable类的字段,或子类Vector来改变它的序列化。该类可以锁定Vector for Serialization和序列化A和B类。如果使用此方法,则无需添加Serializable标记接口。