这是我的代码:
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中,有一些关于对象中某个属性的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();
}
从这里开始,我可以使用反序列化对象作为对象,而且效果很好!
问题在于如何创建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
,请尝试用十六进制字符串表示字节数组或使用base64编码。
除了base64,您还可以使用十六进制字符串!当我遇到类似的问题时,我总是用它!