我正在尝试读取我从MySQL ResultSet获取的字节数组,并使用ObjectInputStream将其转换为Object。
在readObject()期间,抛出以下异常:
Java.io.StreamCorruptedException: invalid type code: 20
错误并不总是发生,但是当它发生时,它将一直存在,直到我删除并重做数据库中的此条目。它也总是相同的对象 这可能是因为将对象编写为Blob时出现了一些错误吗?或者数据本身有问题吗?
这是我正在使用的代码:
byte[] bytes = resultSet.getBytes(index);
if (bytes != null && bytes.length > 0) {
InputStream byteInput = new ByteArrayInputStream(bytes);
ObjectInputStream objectInput = new ObjectInputStream(byteInput);
Object resultObject = objectInput.readObject();
objectInput.close();
return resultObject;
}
修改:
错误似乎是在写对象时,正如 laune 所建议的那样。但我仍然不知道ObjectOutputStream如何写出损坏的数据
我知道close()缺失了,但如果我是正确的,flush()应该是同样的事情。至少这不应该导致损坏的字节数组
此外,没有其他线程可以在写入时更改对象,并且仅为此一个操作创建输出流,并且永远不会重复使用。
序列化的代码(值为org.w3c.dom.Document):
try {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
objectStream.writeObject(value);
objectStream.flush();
statement.setBytes(index, byteStream.toByteArray());
} catch (Exception e) {
throw new PropertyAccessException("Cannot serialize object", e);
}