Java 反序列化异常:由于serialVersionID,本地类不兼容

Java 反序列化异常:由于serialVersionID,本地类不兼容,java,spring,exception,serialization,stream,Java,Spring,Exception,Serialization,Stream,这是我的密码: MyOwnObject deserializedObject = null; try{ ByteArrayInputStream bis = new ByteArrayInputStream(serializedObject.getBytes()); ObjectInputStream ois= new ObjectInputStream(bis); deserializedObject = (MyOwnObject)ois.readObject();

这是我的密码:

MyOwnObject deserializedObject = null;
try{
    ByteArrayInputStream bis = new ByteArrayInputStream(serializedObject.getBytes());
    ObjectInputStream ois= new ObjectInputStream(bis);
    deserializedObject = (MyOwnObject)ois.readObject();
    ois.close();
}catch(Exception e){
    e.printStackTrace();
}

someMapper.insert(deserializedObject);
PS:serializedObject是我以前从序列化过程中得到的字符串,我认为它工作得很好

该代码引发一个异常:

local class incompatible: stream classdesc serialVersionUID = 1360826667802527544, local class serialVersionUID = 1360826667806852920
在stacktrace中,有一些关于我的对象中某个属性的整数类型的信息

更新: serializeObject是一个字符串,来自以下代码:

try {
    ByteArrayOutputStream bo = new ByteArrayOutputStream();
    ObjectOutputStream so = new ObjectOutputStream(bo);
    so.writeObject(myObject);
    so.flush();
    serializedObject = bo.toString();
}catch (Exception e) {
    System.out.println(e);
}
答复:

    //Serialization from object to string
    String serializedObject="";
    try{
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(object);
        oos.flush();
        serializedObject = new String(Base64.encode(baos.toByteArray()));
        oos.close();
    }catch(Exception e){
        e.printStackTrace();
    }


    //Deserialization from string to object
    MyOwnObject deserializedObject = null;
    try{
        byte[] bytes = Base64.decode(serializedObject.getBytes());
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        ObjectInputStream ois = new ObjectInputStream(bais);
        deserializedObject = (MyOwnObject)ois.readObject();
        ois.close();
    }catch(Exception e){
        e.printStackTrace();
    }

从这里,我可以使用反序列化对象作为一个对象,它工作得很好

问题在于如何创建
serializedObject

您可以使用一个
ByteArrayOutputStream
。您不应该对其调用
toString()
。相反,调用它的
toByteArray()
方法以获取作为字节数组的基础数据,您可以使用它来创建
ByteArrayInputStream
,它将起作用

例如:

// Serialization
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream so = new ObjectOutputStream(bo);
so.writeObject(myObject);
so.flush();
byte[] serializedObject = bo.toByteArray();

// Deserialization
MyOwnObject deserializedObject = null;
try {
    ByteArrayInputStream bis = new ByteArrayInputStream(serializedObject);
    ObjectInputStream ois = new ObjectInputStream(bis);
    deserializedObject = (MyOwnObject)ois.readObject();
    ois.close();
} catch (Exception e){
    e.printStackTrace();
}
序列化对象是字节序列(字节数组),而不是字符序列。不能从序列化对象的字节创建
字符串
,因为它可能不包含有效的unicode代码点


如果确实需要将序列化对象表示为
字符串
,请尝试在中或使用中表示字节数组。

除了base64之外,还可以使用十六进制字符串!我总是在遇到类似问题时使用它

什么是以及如何创建
serializedObject
?它来自ByteArrayOutputStream bo=new ByteArrayOutputStream();ObjectOutputStream so=新的ObjectOutputStream(bo);so.writeObject(myObject);所以,flush();serializedObject=bo.toString();serializedObject是一个字符串:这可能就是问题所在。对象序列化为字节,而不是字符。不要将二进制字节转换为字符串。@NicoPratama您应该使用
serializedObject
的详细信息编辑您的问题,而不是将其添加到注释中。这是一种错误的方法。但是请看我编辑过的答案,最后我提到了如何从序列化对象创建
字符串
。我到处都看到base64用于解决这个问题,这是最好的选择吗?我将把serializedObject字符串发送到队列(JMS w/Apache ActiveMQ)然后再使用它并重建一个对象以供进一步使用。在这种情况下,检查软件/代码的文档是否符合预期,在这种情况下,您显然别无选择,只能创建所需的表单。如果您将是读取消息并反序列化对象的人,那么决定权在您手中。这两种方法(十六进制字符串和base64)在任何情况下都可以工作。如果对象很小,十六进制字符串速度更快。如果对象较大,则base64生成较小的字符串。所以你决定了。我使用base 64,尽管通过MQ发送的字符串不可读并且类似于一些散列代码,但重要的是可以发送该字符串并将其转换回对象。。谢谢@icza!