在Java中,Collection-interfaces不会扩展Serializable,原因有很多。此外,这些接口的大多数常见实现都实现了Serializable。
因此,实现其中一个Collection-interfaces的对象是可序列化的,如果实现本身是可序列化的(通常是这种情况) 和 如果集合中的对象都是可序列化的。
但我怎样才能确保满足这两个条件?我不想遇到运行时错误,因为编译器可以检查这些条件。我正在考虑一些明显的界面(展示List-interface):
public interface SerializableList<T extends Serializable> extends Serializable, List<T> {}
我想知道是否没有其他人面临这个问题,并提出了这个简单的解决方案。到目前为止,我无法找到任何解决方案甚至讨论,这让我怀疑我的想法。
你基本上要求的是一个连接两种类型的类型定义:
<type-def> a = null;
你需要的是替代 <type-def>
使用规范,确保引用的对象 a
实现两者 Serializable
以及 Collection<? 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
marker只是一个非正式的“标签”,确保您的集合及其内容实现 Serializable
仍然不保证集合及其内容实际上 能够 被序列化。
Serializable
不是一个很棒的界面。它应该是一个注释,如果它们在实施时可用。
你会怎么处理一个 List
一个 List
没有的东西 Serializable
。您需要确保没有对象在对象图中传递下来是不可序列化的。并非所有实现的对象 Serializable
实际上可以序列化。
克隆集合和包含对象的方法是
import org.apache.commons.lang3.SerializationUtils;
...
ClonedArrayList = SerializationUtils.deserialize(SerializationUtils.serialize(OriginalArrayList))
(例如,通过使用ArrayList <Type>(集合),因为SerializationUtils需要Serializable接口)
问候,
贡纳尔