可反序列化的异常:本地类与serialVersionuID不兼容

时间:2014-09-17 06:45:27

标签: java spring exception serialization stream

这是我的代码:

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

在堆栈跟踪中,有一些关于我的对象中某些属性的Integer类型。

更新: 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();
    }

从这里开始,我可以使用deserializedObject作为对象,它运行良好!

2 个答案:

答案 0 :(得分:1)

问题在于如何创建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();
}

序列化对象是一个字节序列(一个字节数组),而不是一个字符序列。您无法从序列化对象的字节创建String,因为它可能不包含有效的unicode代码点。

如果您确实需要将序列化对象表示为String,请尝试在hex string中表示字节数组或使用base64 encoding

答案 1 :(得分:1)

除了base64,你也可以使用十六进制字符串!当我遇到类似的问题时,我总是使用它!