Java:如何确保可序列化的集合

时间:2013-07-23 08:23:07

标签: java serialization collections

在Java中,Collection-interfaces没有扩展Serializable,原因有很多。此外,这些接口的大多数常见实现都实现了Serializable。

如果实现本身是可序列化的(通常是这种情况),如果集合中的对象都是可序列化的,那么实现其中一个Collection-interfaces的对象是可序列化的。

但我怎样才能确保满足这两个条件?我不想遇到运行时错误,因为编译器可以检查这些条件。我正在考虑一些明显的界面(如List-界面的展示):

public interface SerializableList<T extends Serializable> extends Serializable, List<T> {}

我想知道是否没有其他人面临这个问题,并提出了这个简单的解决方案。到目前为止,我无法找到任何解决方案,甚至没有对此进行讨论,这让我怀疑我的想法。

3 个答案:

答案 0 :(得分:6)

Serializable不是一个很棒的界面。它应该是一个注释,如果它们在实现时可用。

您如何处理List List的{​​{1}}之内的事件Serializable。您需要确保没有对象在对象图中传递不可传递。并非所有实现Serializable的对象都可以实际序列化。

答案 1 :(得分:6)

您基本上要求的是一种连接两种类型的类型定义:

<type-def> a = null;

您需要的是用规范替换<type-def>,确保a引用的对象同时实现SerializableCollection<? extends Serializable>。 Java语言不支持这种类型定义。

正如您已经写过的,最明显的解决方案可能是声明您自己的界面,加入这两个其他界面:

interface SerializableCollection<T extends Serializable> extends Collection<T>, Serializable {}

似乎没问题,直到你尝试这样的事情:

SerializableCollection<String> a = new ArrayList<String>();

然而,这不会编译。即使ArrayList<String>同时实现Collection<? extends Serializable>Serializable,该类也不会实现SerializableCollection<String>

现在,如果你愿意的话,你可以通过声明一个新类来解决这个问题:

SerializableArrayList<T extends Serializable> extends ArrayList<T> implements SerializableCollection<T> {}

现在,您基本上已经完成了所需的一切,并且能够满足原始要求:

SerializableCollection<String> a = new SerializableArrayList<String>();

值得努力吗?在你的情况下,你必须决定,但我会说不。我的论点是,由于Serializable标记只是一个非正式的“标签”,因此确保您的集合及其内容实现Serializable仍然不能保证集合及其内容实际上可以序列化。

答案 2 :(得分:1)

克隆集合和包含对象的方法是

import org.apache.commons.lang3.SerializationUtils;
...
ClonedArrayList = SerializationUtils.deserialize(SerializationUtils.serialize(OriginalArrayList))

(例如,通过使用ArrayList&lt; Type&gt;(集合),因为SerializationUtils需要Serializable接口)

此致 贡纳尔