我有以下类包含下面指定的字段。我的问题是,Admin,Worker和我所有其他自定义类是否必须将Serializable for MyClass实现为Serializable?
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;
...
}
答案 0 :(得分:3)
我的问题是,Admin,Worker和我所有其他自定义类是否必须将Serializable for MyClass实现为Serializable?
是。他们必须是。
默认情况下, ArrayList
已经实现了Serializable
接口。但是您需要为您正在使用的类型实现Serializable接口。
实现
java.io.Serializable interface
的类启用了类的可序列化。未实现此接口的类将不会将其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。
答案 1 :(得分:2)
正如其他人所说,如果一个类被标记为Serializable
,那么内部的所有内容也需要标记为Serializable
。
但在这种情况下,你确实需要确保限制内部状态的可变性。换句话说,当在(构造函数或setter)中获取可变对象(如ArrayList
)或返回它(在getter中)时,创建副本以保护MyClass
的内部状态。这始终是一种很好的做法,尤其适用于Serializable
。
答案 2 :(得分:1)
是
如果您不希望序列化这些内容,请将其标记为transient
。
答案 3 :(得分:0)
如果你要创建一个可序列化的类,那么你必须确保该类中的所有内容都是可序列化的。所以你必须先将它们序列化。
答案 4 :(得分:0)
是的,但只有当列表/地图不为空时。在这种情况下,序列化机制将尝试序列化集合的内容。