您可以使用带有接口条目的接口集合进行序列化吗?

时间:2013-09-07 18:57:32

标签: java

假设我有

public interface General extends Serializable {
   ...
}

public class Specific implements General {
   ...
}

我可以通过ArrayList<Specific>发送ObjectOutputStream类型的对象并通过转换为List<General>对其进行反序列化吗?那会有用吗?如果没有,我该怎么做?

3 个答案:

答案 0 :(得分:0)

我自己没有尝试过,但我认为它会起作用 - 看看ArrayList.readObject()/writeObject()writeObject()将写Specific个对象,readObject()应该能够将它们作为Specific的实例读回来,并且反序列化列表中的每个元素都是General 1}}引用,这样就可以了。

答案 1 :(得分:0)

ArrayList是Serializable,根据javadocs(许多Collection类都是,只要它们包含的对象是),只要泛型类型是可序列化的,序列化方面就可以了 - 你要序列化并回读一个对象是一个ArrayList

这是一个不确定的演员。一般来说,它被认为是不安全的。如果你有

 List<Specific> 

你将无法将其投射到

 List<Generic>

它们在逻辑上是不一样的(即使它们确实是在运行时)。事实上,在程序中直接演员会有问题,因为这是有效的:

List<Specific> specific = ...;
List<Generic> generic = (List<Generic>) specific;

generic.add(new OtherImplExtendingGeneric());
specific.get(specific.length() -1).methodOnlyOnSpecific(); // Kersplode

但是你把它当作一个对象,你没有其他类型的引用,所以它会解决。它不会阻止你这样做。它将在技术上产生预期的结果。可能有理由,但它肯定会让我在代码审查中挑起眉毛。

为什么需要转换泛型类型?

答案 2 :(得分:0)

是的有效:

out.writeObject(list);

List<General> list = (List<General>)in.readObject();

泛型和“普通”数据类型之间的区别在于泛型只对编译器可见,而不是在运行时。这意味着具有泛型的强制转换不是100%安全的,因为在运行时List<A>List<B>是相同的。

但如果您确定该列表是General的列表,我认为此处没有问题。