我有这个清单
LinkedList<ASD> list = new LinkedList<ASD>();
然后,我添加了一些扩展 ASD 的对象
BSD bsd = new BSD(); // BSD extends ASD
list.add(bsd);
并序列化列表。
如何让它将 bsd 元素序列化和反序列化为 BSD 而不是 ASD?
我有这个清单
LinkedList<ASD> list = new LinkedList<ASD>();
然后,我添加了一些扩展 ASD 的对象
BSD bsd = new BSD(); // BSD extends ASD
list.add(bsd);
并序列化列表。
如何让它将 bsd 元素序列化和反序列化为 BSD 而不是 ASD?
这不成问题。您要序列化的所有对象都必须是实现Serializable
. LinkedList
可以。声明ASD
或BSD
(在您的情况下无关紧要)实施Serializable
并尝试。一切都应该工作。
正如 AlexR 所指出的,一切都很好:
class ASD implements Serializable {
private static final long serialVersionUID = 1L;
}
class BSD extends ASD {
private static final long serialVersionUID = 1L;
}
LinkedList<ASD> list = new LinkedList<ASD>();
list.add(new BSD())
现在,如果你序列化list
,然后反序列化它,它的元素将是正确的类型BSD
。
此外,在序列化期间不会保存泛型类型参数(<ASD>
事物)。序列化过程只会记住那list
是一个LinkedList
对象。这意味着您可以序列化一个类型的对象,LinkedList<ASD>
然后将其反序列化为LinkedList<BSD>
(或什至为 eg LinkedList<Integer>
)。但是,如果您尝试访问无法转换为新指定的泛型类型的列表元素,则稍后可能会引发异常。
最后,我只是说这是可行的,并不是说这是一个好习惯:)