2009-07-09 5 views
2

Идея такова: XmlEncoder записывает операции, необходимые для воспроизведения сериализованного компонента, начиная с ничего. Но что, если мы не начнем из ничего?Использование XmlEncoder для создания delta/difference xml

Может ли XmlEncoder использоваться для записи операций, необходимых для преобразования объекта в другой? И может ли XmlDecoder использовать это преобразование?

Или есть ли другая альтернатива для создания xml, описывающего разницу между двумя объектами и преобразование объекта с использованием данных xml?

+0

Интересное понятие. Можете ли вы дать тривиальный пример? – skaffman

ответ

0

Я считаю, что если мы сгенерируем xml на основе javabeans.dtd, XmlDecoder может преобразовать объект из xml. Javabenas.dtd - схема XmlEncoder. Я включил URL-адрес, который объясняет, как XmlEncoder кодирует объект в xml.

Надеюсь, это поможет. :)

тигр.

0

XMLDecoder делает точно противоположное XMLEncoder, вы начинаете с вашего объекта и декодируете его в xml, тогда вы можете использовать XMLEncoder так же, как и раньше, чтобы преобразовать его в объект.

1

Сам по себе XMLEncoder и XMLDecoder не могут использоваться для выполнения необходимых действий: сопоставление разности XML между двумя объектами и использование этого для преобразования одного объекта в другой.

Но, если 2 объекта одного типа, вы можете использовать магию, чтобы заставить ее работать так, как вам хотелось бы.

Что бы я сделал:

A) Создает объект, который удерживает/propertyValues ​​пары ИмениСвойства. Этот класс будет использоваться для хранения различий между объектами. Даже простой карты (String, Object) достаточно. Например, я называю это ABDifference.

B) Создает метод утилиты, который посредством анализа интроспекции анализирует объект A и объект B и записывает класс ABDifference, содержащий имена и значения свойств, которые отличаются по A и B, удерживая значения B. Используйте Introspector.getBeanInfo, чтобы получить свойствоDescriptor и использовать их для вызова getter и проверки значений свойств с помощью equals.

Пример:

объект А (название: "Пиппо", описание: "версия Пиппо", возраст: 25)

ОБЪЕКТ В (название: "Пиппо", описание: «версия Б Пиппо», возраст: 27)

ABDIFFERENCE (Карта: описание ---> "версия B Пиппо", возраст ---> 27)

C) Зашифровывает этот объект этого класса, который содержит «различия» между двумя исходными объектами с использованием XMLEncoder. Таким образом вы получите простой XML-код, который просто содержит значения свойств, которые отличаются от A до B, например, а не всего объекта.

D) Сделайте метод утилиты, который преобразует A в B путем проверки ABDifference. Он будет легко реализован путем циклирования на парах Key/Value карты и использования отражения для вызова установщика этого свойства (используйте Introspector.getBeanInfo для легкого получения свойств java beans), чтобы преобразовать A в B.

Таким образом, у вас есть 2 метода полезности, которые отображают разницу между двумя объектами одного класса в специальном классе, который содержит только различия. Вы XMLEncode и передаете это и XMLDecode другим способом, а затем используйте объект для преобразования A в B.

ДОПОЛНИТЕЛЬНЫЕ УЛУЧШЕНИЯ: вы даже можете добавить специальные средства защиты для обычных типов, такие как сопоставление образцов для свойств строк, чтобы избежать записи строки WHOLE в разнице, но только реальная разница между двумя строками.

Один простой способ сделать это - найти самый длинный совпадающий «старт» и «конец» строки и просто кодировать разницу между ними особым образом.

Например, вы можете использовать этот формат: $ charnumber $, поэтому кодированная строка будет $ n $ центральной частью строки $ m $, где n - это символ, где центральная часть для замещения начинается, а m - char, где центральная часть заменяет концы. Конечно, вам следует избегать выбора специального символа ($ в этом случае) с двойным специальным символом и преобразовать его обратно.

OBJECT A (имя: "Пиппо", описание: "версия Пиппо", возраст: 25)

ОБЪЕКТ B (название: "Пиппо", описание: "версия B моего Пиппо", возраст : 27)

ABDIFFERENCE (Карта: описание ---> "$ 8 $ B моих $ 14 $", возраст ---> 27)

Поэтому чтение разницы строк вы знаете, что вы составляете строка вроде этого:

«версия» (1-8 символов от значения, как и $ 8 $, говорит нам) + «B моего» (разница в строке разницы между $ 8 $ $ 14 $ + "pippo" (символы 14+ от значения A)

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