Сам по себе 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)