我有一个被分类的类并且将非常大量的数据对象转换为blob以将其保存到数据库。在同一个类中有解码方法将blob转换为实际对象。以下是编码和编码的代码解码对象。
private byte[] encode(ScheduledReport schedSTDReport)
{
byte[] bytes = null;
try
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(schedSTDReport);
oos.flush();
oos.close();
bos.close();
//byte [] data = bos.toByteArray();
//ByteArrayOutputStream baos = new ByteArrayOutputStream();
//GZIPOutputStream out = new GZIPOutputStream(baos);
//XMLEncoder encoder = new XMLEncoder(out);
//encoder.writeObject(schedSTDReport);
//encoder.close();
bytes = bos.toByteArray();
//GZIPOutputStream out = new GZIPOutputStream(bos);
//out.write(bytes);
//bytes = bos.toByteArray();
}
catch (Exception e)
{
_log.error("Exception caught while encoding/zipping Scheduled STDReport", e);
}
decode(bytes);
return bytes;
}
/*
* Decode the report definition blob back to the
* ScheduledReport object.
*/
private ScheduledReport decode(byte[] bytes)
{
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ScheduledReport sSTDR = null;
try
{
ObjectInputStream ois = new ObjectInputStream(bais);
//GZIPInputStream in = new GZIPInputStream(bais);
//XMLDecoder decoder = new XMLDecoder(in);
sSTDR = (ScheduledReport)ois.readObject();//decoder.readObject();
//decoder.close();
}
catch (Exception e)
{
_log.error("IOException caught while decoding/unzipping Scheduled STDReport", e);
}
return sSTDR;
}
这里的问题是我在这堂课中改变别的东西的时候 表示任何其他方法,创建新的类版本,因此该类无法解码最初编码的blob对象的新版本。我传递给编码的对象也是seralized对象但存在这个问题。感谢任何想法
答案 0 :(得分:2)
是的,Java二进制序列化非常脆弱:(
您可以向类添加静态serialVersionUID
字段,以便您可以控制版本号...这可以防止因添加方法而导致的问题。但是,在添加字段时,您仍会遇到潜在的问题。有关更多详细信息,请参阅JavaDocs Serializable
。
您可能需要考虑使用其他序列化格式such as Protocol Buffers来为您提供更多控制权。
答案 1 :(得分:0)
您可以实施java.io.Externalizable
,以便能够控制反序列化中序列化和预期的内容。