Сам по себе 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)
Интересное понятие. Можете ли вы дать тривиальный пример? – skaffman