0

我有这个清单

LinkedList<ASD> list = new LinkedList<ASD>();

然后,我添加了一些扩展 ASD 的对象

BSD bsd = new BSD(); // BSD extends ASD
list.add(bsd);

并序列化列表。

如何让它将 bsd 元素序列化和反序列化为 BSD 而不是 ASD?

4

2 回答 2

2

这不成问题。您要序列化的所有对象都必须是实现Serializable. LinkedList可以。声明ASDBSD(在您的情况下无关紧要)实施Serializable并尝试。一切都应该工作。

于 2013-02-05T12:44:12.410 回答
0

正如 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>)。但是,如果您尝试访问无法转换为新指定的泛型类型的列表元素,则稍后可能会引发异常。

最后,我只是说这是可行的,并不是说这是一个好习惯:)

于 2013-02-05T13:21:10.780 回答