我正在从序列化文件中读取对象,我真的不喜欢我必须转换结果的事实,例如
vars = (HashMap<String, Integer>) out.readObject();
Run Code Online (Sandbox Code Playgroud)
作为类型信息的粉丝,因为我讨厌演员阵容。是否可以避免它并明确告诉应该从序列化文件中读取什么类型?
ObjectInputStream不是泛型类型,并且不提供泛型方法。
有特定的方法read[primitive]提供,但对于实际对象,只有readObject提供 - 它返回Object。
当然,如果您不需要使用 Java 自己的Serializable接口Externalizable,而是希望使用特定框架(例如 Jackson)进行序列化,那么您可以使用在反序列化时不需要显式向下转换的方法。
笔记
ObjectInputStream不是final,您可以扩展它以提供您自己的实现,这可以允许您提供通用类或方法,并在调用您readTypedObject自己的某些方法时防止强制转换。
然后,您可以readClassDescriptor()与Class<T>初始化自己的ObjectInputStream实现进行比较,以确保正在读取的对象可以分配给您的参数化类型。
然而,无论如何,您最终都会在某个时刻进行转换,因为您可能也T不想覆盖!readObject
TL;DR,在我看来,太多的努力和复杂性,我只是在接收端进行铸造。