我理解不兼容的serialVersionUIDs背后的理论(即您可以区分同一类的不同编译版本),但我遇到了一个问题,我不明白并且不属于明显的错误原因(相同类的不同编译版本)。
我正在测试序列化/反序列化过程。所有代码都在同一台机器上运行,在同一VM中运行,并且序列化和反序列化方法都使用编译类的相同版本。序列化工作正常。被序列化的类非常复杂,包含许多其他类(Java类型和UDT),并且包含引用循环。我没有在任何类中声明自己的UID。
以下是代码:
我正在测试序列化/反序列化过程。所有代码都在同一台机器上运行,在同一VM中运行,并且序列化和反序列化方法都使用编译类的相同版本。序列化工作正常。被序列化的类非常复杂,包含许多其他类(Java类型和UDT),并且包含引用循环。我没有在任何类中声明自己的UID。
以下是代码:
public class Test {
public static void main(String[] args) throws Exception {
ContextNode context = WorkflowBuilder.getSimpleSequentialContextNode();
String contextString = BinarySerialization.serializeToString(context);
ContextNode contextD = BinarySerialization.deserializeFromString(ContextNode.class, contextString);
}
}
public class BinarySerialization {
public static synchronized String serializeToString(Object obj) throws Exception {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(byteStream);
oos.writeObject(obj);
oos.close();
return byteStream.toString();
}
public static synchronized <T> T deserializeFromString(Class<T> type, String byteString) throws Exception {
T object = null;
ByteArrayInputStream byteStream = new ByteArrayInputStream(byteString.getBytes());
ObjectInputStream in = new ObjectInputStream(byteStream);
object = (T)in.readObject();
in.close();
return object;
}
}
我在反序列化时遇到了InvalidClassException(本地类不兼容:流类描述符serialVersionUID = -7189235121689378989,本地类serialVersionUID = -7189235121689362093)。
这是什么根本问题?我应该如何解决它?
谢谢
编辑
我应该说明一下目的。序列化数据既需要存储在sqlite数据库中,也需要通过网络传输给其他客户端。如果String
是传递序列化数据的错误格式,那么我应该使用什么来存储和传递数据?再次感谢。
byte[]
是二进制数据的正确容器。任何严肃的存储格式或传输协议都应该能够直接处理二进制数据。 - Joachim Sauer