Предотвращение настройки сериализации Java по умолчанию - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть сериализованный объект MyObject, который содержит целое число foo. Я установил значение 10 в целое число foo и сохранил объект в файл, используя writeObject ().

Я добавляю целочисленную строку к объекту MyObject. Я установил значение 15 в целочисленную строку, а затем загрузил старый сериализованный файл, используя readObject ().

Старый сериализуемый файл не содержит целочисленную строку, поэтому целочисленная строка получит значение 0. Я хочу сохранить значение 15 в строке, если старый сериализуемый файл не содержит переменную bar.

Должен ли я переопределить readObject () или как я могу запретить readObject () устанавливать «значения по умолчанию» для неизвестных объектов?

Я хочу сделать это, потому что в конструкторе я устанавливаю свои собственные значения по умолчанию и хотел бы использовать свои собственные значения по умолчанию для управления версиями.

Ответы [ 3 ]

1 голос
/ 13 февраля 2012

Будет ли добавление следующего метода в ваш MyObject для вас?

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException
{
    bar = 15;  // Set a default value of 15 if it's not in the serialized output file
    ois.defaultReadObject();
}
1 голос
/ 13 февраля 2012

Сериализация не устанавливает значения по умолчанию, она относится к схеме инициализации значения по умолчанию Java.

Если я могу подвести итог вашего вопроса.Вы хотите, чтобы сериализация объединяла содержимое сериализованного потока со значениями в памяти.Это невозможно с сериализацией Java, поскольку она контролирует, какие объекты создавать.Вы можете прочитать свой сериализованный объект, а затем вручную написать код, чтобы объединить поля, которые вы хотите объединить.Если вы застряли на сериализации Java (я бы избежал этого на вашем месте), но, скажем, вы хотите продолжать использовать его.

public class MyObject {

    public void merge( MyObject that ) {
        // given some other instance of an object merge this with that.
        // write your code here, and you can figure out the rules for which values win.
    }
}

ObjectInputStream stream = new ObjectInputStream( new FileInputStream( file ) );
MyObject that = stream.readObject();
someObject.merge( that );

Viola, вы контролируете, какие поля будут объединены с этим вSomeObject.Если вы хотите, чтобы библиотека выполняла это слияние, проверьте http://flexjson.sourceforge.net. Она использует сериализацию JSON и работает с Beans, а не с POJO.Однако есть способ взять уже заполненный объект и перезаписать значения из потока JSON.Есть ограничения к этому.Другим преимуществом этого является то, что вы можете на самом деле читать поток обратно ПОСЛЕ того, как ваша структура объекта изменила что-то, что технически может сделать Java-сериализация, но это очень и очень сложно.

0 голосов
/ 13 февраля 2012

Используйте ключевое слово transient, чтобы исключить поля из сериализации / десериализации.

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