Java - 是否可以在不进行转换的情况下读取序列化对象?

Tom*_*z R 3 java generics

我正在从序列化文件中读取对象,我真的不喜欢我必须转换结果的事实,例如

vars = (HashMap<String, Integer>) out.readObject();
Run Code Online (Sandbox Code Playgroud)

作为类型信息的粉丝,因为我讨厌演员阵容。是否可以避免它并明确告诉应该从序列化文件中读取什么类型?

Men*_*ena 5

ObjectInputStream不是泛型类型,并且不提供泛型方法。

有特定的方法read[primitive]提供,但对于实际对象,只有readObject提供 - 它返回Object

当然,如果您不需要使用 Java 自己的Serializable接口Externalizable,而是希望使用特定框架(例如 Jackson)进行序列化,那么您可以使用在反序列化时不需要显式向下转换的方法。

笔记

ObjectInputStream不是final,您可以扩展它以提供您自己的实现,这可以允许您提供通用类或方法,并在调用您readTypedObject自己的某些方法时防止强制转换。

然后,您可以readClassDescriptor()Class<T>初始化自己的ObjectInputStream实现进行比较,以确保正在读取的对象可以分配给您的参数化类型。

然而,无论如何,您最终都会在某个时刻进行转换,因为您可能也T不想覆盖!readObject

TL;DR,在我看来,太多的努力和复杂性,我只是在接收端进行铸造。