Сериализация в основном глубокое клонирование.
Необходимо отслеживать каждую ссылку на объект для повторных валют (например, с помощью IdentityHashMap ). Каким бы ни был ваш последний метод реализации (если не внешняя библиотека), не забудьте проверить повторяемость объектов, или вы можете оказаться в бесконечном цикле (когда объект A имеет ссылку на объект B, который снова имеет ссылку на объект A или что-то более сложное в граф объектов).
Один из способов - пройти по графу объектов с помощью DFS-подобного алгоритма и построить оттуда клон (сериализованную строку).
Этот псевдокод, надеюсь, объясняет, как:
visited = {}
function visit(node) {
if node in visited {
doStuffOnReoccurence(node)
return
}
visited.add(node)
doStuffBeforeOthers(node)
for each otherNode in node.expand() visit(otherNode)
doStuffAfterOthers(node)
}
Посещаемый набор в примере - это то место, где я бы использовал набор идентификаторов (если он был) или IdentityHashMap.
При рефлексивном поиске полей (то есть части node.expand ()) не забудьте также пройти через поля суперкласса.
Отражение не должно использоваться в «нормальном» случае разработки. Reflection обрабатывает код как данные, и вы можете игнорировать все обычные ограничения доступа к объектам. Я использовал этот рефлексивный материал для глубокого копирования только для тестов:
В тесте, который проверял различные виды объектов на предмет глубокого равенства графов объектов
В тесте, который анализировал размер графа объекта и другие свойства