哪些类必须实现Serializable接口?

时间:2011-08-13 12:24:34

标签: java serializable

我想通过套接字发送一个对象,所以我必须实现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;
}

5 个答案:

答案 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。对此的要求是

  1. B类必须提供默认构造函数(和)
  2. A类必须提供以下方法的实现:

    private void readObject(ObjectInputStream ois)

    private void writeObject(ObjectOutputStream oos)

  3. 如果声明B类,则序列化A的实例肯定更容易 Serializable如果不是Vector。如果允许,可以使默认序列化起作用。

    拥有{{1}}的B在上述情况下没有任何区别(它只是添加了另一层结构)。

答案 4 :(得分:0)

你可以有一个包装类序列化Vector,前提是它是另一个Serializable类的字段,或子类Vector来改变它的序列化。该类可以锁定Vector for Serialization和序列化A和B类。如果使用此方法,则无需添加Serializable标记接口。