gpt4 book ai didi

Java 序列化 - 不兼容的 serialVersionUID

转载 作者:搜寻专家 更新时间:2023-11-01 01:19:31 25 4
gpt4 key购买 nike

我理解不兼容的 serialVersionUIDs 背后的理论(即你可以区分同一类的不同编译版本)但我看到一个我不理解的问题并且不属于明显的错误原因(不同的编译版本同一个类(class))。

我正在测试序列化/反序列化过程。所有代码都在一台机器上运行,在同一个虚拟机中,序列化和反序列化方法都使用相同版本的编译类。序列化工作正常。被序列化的类非常复杂,包含许多其他类(java 类型和 UDT),并且包含循环引用。我还没有在任何类(class)中声明自己的 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(本地类不兼容:stream classdesc serialVersionUID = -7189235121689378989,本地类 serialVersionUID = -7189235121689362093)。

根本问题是什么?我该如何解决?

谢谢

编辑我应该说明这样做的目的。序列化数据既需要存储在 sqlite 数据库中,又需要通过网络发送给其他客户端。如果 String 是传递序列化数据的错误格式,我应该使用什么来存储和传递数据?再次感谢。

最佳答案

第一条规则:在处理二进制数据时,切勿使用Stringchar[]ReaderWriter

您正在处理二进制数据并尝试将其放入 String 中。不要那样做,那是一个固有的错误操作。

接下来:byteStream.toString() 的返回值不以任何方式表示 ByteArrayOutputStream 的实际内容。您需要使用 .getBytes() 并传递 byte[](记住:将二进制数据视为二进制数据而不是 String).

关于Java 序列化 - 不兼容的 serialVersionUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3555777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com