Использование XmlEncoder для создания разностных / разностных XML - PullRequest
2 голосов
/ 09 июля 2009

Идея заключается в следующем: XmlEncoder записывает операции, необходимые для воспроизведения сериализованного компонента, начиная с нуля. Но что, если мы не начнем с нуля?

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

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

Ответы [ 3 ]

1 голос
/ 01 сентября 2009

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

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

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

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

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

Пример:

ОБЪЕКТ A (имя: «pippo», описание: «версия A pippo», возраст: 25 лет)

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

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

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

D) Выполните служебный метод, который преобразует A в B, проверив ABDifference. Это будет легко реализовано путем циклического преобразования пар ключ / значение на карте и использования отражения для вызова установщика этого свойства (используйте Introspector.getBeanInfo, чтобы легко получить свойства Java-бинов) для преобразования A в B.

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

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

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

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

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

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

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

Итак, читая разницу строк, вы знаете, что вам нужно составить строку следующим образом:

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

0 голосов
/ 28 августа 2009

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

0 голосов
/ 10 июля 2009

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

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

тигр.

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