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

标签 java serialization object blob

我有一个类,它是序列化的,并且确实将大量数据对象转换为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/

相关文章:

java - 通过 Logback 的 Dropwizard 自定义日志文件

java - 使用蒙特卡罗方法计算 pi java - 计算不起作用

Java 加法给出错误答案

java - Android 序列化 PendingIntent

java - 无法序列化我的对象

java - 我怎样才能从主类(class)调用一个类(class)?

java - 如何将 InputStream 转换为 int

C++ Boost - 包含类层次结构对象的类的序列化

c# - Json.NET 反序列化对象返回 null

JavaScript - 原型(prototype)方法未定义