【发布时间】:2017-04-19 13:17:59
【问题描述】:
此套接字将继续接收一些旧对象和新对象 一样的名字。但是,如果我直接使用 readObject ,它会抛出 致命的异常。我们中的一些人会建议忽略旧对象或 更改旧的目标代码。这对我来说是不可能改变的 客户代码。我需要处理 向后兼容性。
Socket s = ss.accept();
ObjectInputStream lvStream = new ObjectInputStream(s.getInputStream());
Object lvObject = lvStream.readObject();
// The old class but released ( I cannot change it )
public class Apple extends HashMap<String, String> {
private static final long serialVersionUID = 1L;
}
// The old class but released ( I cannot change it )
public class Apple extends HashMap<String, String> {
private static final long serialVersionUID = 2L;
}
// The new class in my local ( 1L or 2L still would not solve the issue easily )
public class Apple extends HashMap<String, String> {
private static final long serialVersionUID = 2L;
}
在 readObject() 的行, 我得到了这个致命的异常:
java.io.InvalidClassException 本地类不兼容:流 classdesc serialVersionUID = 1,本地类 serialVersionUID = 2
我如何读取这两种 Apple 对象数据(Hashmap)?
谢谢。
【问题讨论】:
-
“它们完全一样” - 不,根据您的评论,它们位于不同的包中。完全限定的类名在序列化(和一般情况下)中很重要。
-
您是在问如何将一个类的序列化对象作为另一个类的实例读取?
-
它们是两种不同的类型。序列版 UID 与它无关。投射到
HashMap并阅读其条目。 -
@qxz 是的。我只想读取这些数据。
-
你确定类的
serialVersionUID在你序列化对象后没有改变吗?这就是您的例外所建议的。
标签: java backwards-compatibility serialversionuid