gpt4 book ai didi

java - 即使类已序列化,Blob 对象也无法正常工作

转载 作者:行者123 更新时间:2023-12-02 08:33:01 33 4
gpt4 key购买 nike

我有一个类,它是序列化的,并且确实将大量数据对象转换为blob以将其保存到数据库中。在同一个类中,有一个decode方法可以将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 对象。我传递给编码的对象也是序列化对象,但存在这个问题。任何想法谢谢

最佳答案

是的,Java 二进制序列化非常脆弱:(

您可以向类添加静态 serialVersionUID 字段,以便您可以控制版本号...这应该可以防止由于添加方法而出现问题。不过,添加字段时您仍然会遇到潜在的问题。请参阅 JavaDocs Serializable了解更多详细信息。

您可能需要考虑使用其他序列化格式 such as Protocol Buffers不过,给你更多的控制权。

关于java - 即使类已序列化,Blob 对象也无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2779791/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com