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

时间:2016-10-05 15:07:06

标签: java generics

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

vars = (HashMap<String, Integer>) out.readObject();

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

1 个答案:

答案 0 :(得分:4)

ObjectInputStream不是通用类型,也不提供通用方法。

提供了read[primitive]的具体方法,但对于实际对象,仅提供readObject - 返回Object

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

注意

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

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

但是,无论如何,你最终会在某个时候投射到T,因为你可能也不想覆盖readObject

TL; DR,在我看来太过努力和复杂化,我只是在接收器端进行投射。