Объект BLOB-объекта не работает должным образом, хотя класс выделен - PullRequest
0 голосов
/ 06 мая 2010

У меня есть класс, который разделен и действительно преобразует очень большой объем объекта данных в 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-объекта. Объект, который я передаю для кодирования, также является разделенным объектом, но эта проблема существует. Любые идеи спасибо

Ответы [ 2 ]

2 голосов
/ 06 мая 2010

Да, двоичная сериализация в Java довольно хрупкая: (

Вы можете добавить статическое поле serialVersionUID в класс, чтобы вы могли контролировать номера версий ... это должно предотвратить проблемы из-за добавления методов. Вы все равно столкнетесь с потенциальными проблемами при добавлении полей. См. JavaDocs для Serializable для получения дополнительной информации.

Возможно, вы захотите использовать другой формат сериализации , такой как буфер протокола , чтобы дать вам больше контроля.

0 голосов
/ 06 мая 2010

Вы можете реализовать java.io.Externalizable, чтобы иметь возможность контролировать то, что сериализуется и ожидается при десериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...