【问题标题】:Java Serializable: Must E be serializable in ArrayList<E>?Java 可序列化:E 必须在 ArrayList<E> 中可序列化吗?
【发布时间】:2013-12-25 03:14:48
【问题描述】:

我有以下类,其中包含下面指定的字段。我的问题是,Admin、Worker 和我所有其他自定义类必须实现 Serializable 才能使 MyClass 可序列化吗?

public class MyClass implements java.io.Serializable {
  private static final long serialVersionUID = 1L;
  ArrayList<Admin> admins;
  ArrayList<Worker> workers;
  ArrayList<Manager> managers;
  ArrayList<Secretary> secretaries;
  ArrayList<Category> categories;
  HashMap<Issue, HashMap<Category,Manager>> ManagedIssues;
  private static MyClass instance;
      ...
}

【问题讨论】:

    标签: java serializable


    【解决方案1】:

    我的问题是,Admin、Worker 和我所有其他自定义类是否必须实现 Serializable 才能使 MyClass 可序列化?

    是的。他们必须是。

    ArrayList 已经默认实现了Serializable 接口。但是你需要为你使用的类型实现 Serializable 接口。

    类的可串行化由实现java.io.Serializable interface 的类启用。未实现此接口的类将不会对其任何状态进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。

    【讨论】:

      【解决方案2】:

      正如其他人所说,如果一个类被标记为Serializable,那么里面的所有东西也需要被标记为Serializable

      但在这种情况下,您确实需要确保限制内部状态的可变性。换句话说,当在(构造函数或setter)中获取可变对象(如ArrayList)或返回它(在getter中)时,制作副本以保护MyClass的内部状态。这始终是一个很好的做法,尤其是 Serializable

      【讨论】:

        【解决方案3】:

        是的。

        如果您不希望这些内容被序列化,请将其标记为transient

        【讨论】:

          【解决方案4】:

          如果您要使一个类可序列化,那么您必须确保该类中的所有内容也是可序列化的。所以你必须先让它们可序列化。

          【讨论】:

            【解决方案5】:

            是的,但前提是这些列表/地图不为空。在这种情况下,序列化机制将尝试序列化集合的内容。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-08-30
              • 1970-01-01
              • 2013-10-22
              • 2019-05-15
              • 2019-03-17
              • 2014-05-30
              • 1970-01-01
              • 2012-02-05
              相关资源
              最近更新 更多