18

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

因此,如果实现本身是可序列化的(通常是这种情况)并且集合中的对象都是可序列化的,那么实现集合接口之一的对象是可序列化的。

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

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

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

4

3 回答 3

9

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

<type-def> a = null;

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

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

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仍然不能保证集合及其内容实际上可以被序列化。

于 2013-07-23T09:18:06.860 回答
7

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

你将如何处理一个List不存在List的东西Serializable。您需要确保没有对象在对象图中是不可序列化的。并非所有实现的对象都Serializable可以实际序列化。

于 2013-07-23T08:38:20.733 回答
1

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

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

(例如通过使用 ArrayList<Type>(collection) 因为 SerializationUtils 需要 Serializable 接口)

问候,贡纳尔

于 2017-01-11T14:53:51.663 回答