【问题标题】:Which classes must implement the Serializable interface?哪些类必须实现 Serializable 接口?
【发布时间】:2011-10-26 09:29:11
【问题描述】:

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

【问题讨论】:

  • 向量是可序列化的。当然,里面的东西也必须是可序列化的。如果里面的东西是 B 的实例,那么你必须使 B 可序列化。

标签: java serializable


【解决方案1】:

两者兼而有之。 A 不能被序列化,只要它具有类型为 B 的非静态成员并且 1) 变量 b 未标记为 transient 或 2) 类 B 不实现可序列化。

【讨论】:

  • 你能回答我添加到问题的部分吗?
  • @saeed Vector 实现 Serializable
  • @Matten- 那么 B 应该实现 Serializable 吗?
  • @saeed 是的,否则当您尝试发送A 类型的对象时,您会得到序列化异常
【解决方案2】:

如果两个类都不是内部类,则可以采用任何一种方式。在许多情况下更简单地独立序列化两者。但是序列化 A 通常更快,并且更独立于版本,而不是 B,在 A 的序列化中包含重新创建 B 所需的信息。

如果一个或两个都是内部类,那么序列化它们会变得更混乱/更慢,最好将它们的娱乐信息包含在外部类中。

当然,当一个类的对象被多个其他对象引用时,你通常别无选择,只能分别序列化它们。

【讨论】:

  • 你能回答我添加到问题的部分吗?
【解决方案3】:

可以序列化 A 的实例,即使 B 未声明为 Serializable。这样做的要求是

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

    private void readObject(ObjectInputStream ois)

    private void writeObject(ObjectOutputStream oos)

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

B 的Vector 对上述情况没有影响(它只是增加了另一层结构)。

【讨论】:

  • B 不需要默认构造函数,它只需要 A 可以访问的 any 构造函数。
【解决方案4】:

如果你不让 B 可序列化,你会得到序列化异常。

【讨论】:

  • 你能回答我添加到问题的部分吗?
【解决方案5】:

您可以有一个包装类序列化 Vector,只要它是另一个 Serializable 类的字段,或者是子类 Vector 以更改其序列化。此类可以锁定 Vector 以进行序列化和序列化 A 和 B 类。如果使用这种方法,则不需要添加 Serializable 标记接口。

【讨论】:

  • Peter Vector.writeObject() 是同步的,所以它是线程安全的。我们之前不是有过这样的讨论吗?
  • 我们有一个类似的关于 List 与 Vector、Map 与 Hashtable 以及一个是否是遗留类。我已删除评论 Vector.writeObject 是线程安全的。
猜你喜欢
  • 1970-01-01
  • 2019-06-30
  • 2019-10-09
  • 2012-03-05
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
相关资源
最近更新 更多