2013-04-29 3 views
0

Я рассматриваю возможность использования flexjson для сериализации своих бизнес-объектов в файл в приложении Android, просто используя JSONSerializer(). DeepSerialise (myObject) и JSONDeserializer(). Deserialise (jsonString) со всеми стандартными трансформаторами и объектными фабриками.flexjson и управление версиями: насколько приемлемым является изменение flexjson?

Я надеюсь, что после выпуска приложения любые изменения в бизнес-модели должны быть учтены путем написания трансформаторов flexjsons и объектных заводов в новой версии для обеспечения совместимости с предыдущими версиями.

Что я не уверен в том, с чем могут справиться трансформаторы по умолчанию и объекты-объекты. i.e если я добавлю поле в класс и десериализую из старой версии без поля в новый класс, то он будет терпеть неудачу или новое поле будет нулевым или 0 (если число). Тот же вопрос, если я удалю поле, что произойдет.

В стандартной сериализации это все документировано здесь .. http://docs.oracle.com/javase/7/docs/platform/serialization/spec/version.html

Но я не могу найти эквивалентную информацию для flexjson, что сделки явно с вопросами, связанных с версиями объектов, Есть ли?

Cheers, Phil.

ответ

0

Flexjson сначала рассмотрит JSON, чтобы найти все содержащиеся в нем поля, а затем ищет эти поля в объекте, который вы десериализуете. Поэтому добавление новых полей в объект не приведет к сбою процесса десериализации. Новое поле просто не будет заполнено из объекта JSON (т. Е. Оно сохранит значения, установленные в конструкторе или значения инициализации).

Если вы удалите поле из объекта в будущем, Flexjson просто не будет десериализовать это значение в объекте, потому что он не найдет для него сеттер.

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

Единственная часть, которая становится очень сложной, - это переименование полей или изменение типов в поле. Поле переименования можно обрабатывать, сохраняя старый сеттер вокруг и внутренне устанавливая новое поле в этом более старом сетевом устройстве. Вы можете отметить его закрытым или защищенным, чтобы скрыть его снаружи, и Flexjson все равно будет его использовать. Если вы измените тип, это намного сложнее. Один из вариантов заключается в том, чтобы держать старый сеттер с прежним типом (например, setFoo (String) и setFoo (List)) и адаптироваться к новому типу. Другой вариант - написать ObjectFactory для перевода между двумя потенциальными типами. Это, конечно, сложнее всего. Последняя опция не делает этого без изменения имени поля и использует один из других методов для перевода.

+0

Могу ли я спросить, отменяет ли десериализация FlexJSON, если в json добавлено дополнительное поле, которое отсутствует в объекте? –

+1

Он просто игнорирует это поле. – chubbsondubs

+0

Спасибо, что сообщили мне. –

Смежные вопросы