C # глубокое копирование древовидных структур с помощью BinaryFormatter - PullRequest
0 голосов
/ 03 сентября 2010

РЕДАКТИРОВАТЬ 1

Кент развеял мои страхи. Однако я нашел одно исключение из правила. Я написал метод для класса Node, который будет проходить вверх по иерархии, пока не доберется до корневого Node и не вернет свой хэш-код. Хеш-код одинаков для всех строк, кроме одного объекта. Одним словом, RAGE.


Я заканчиваю писать свое первое (относительно) большое приложение на C #. Тем не менее, я думаю, что нашел серьезную ошибку, на которую я облажался.

Мое приложение анализирует файл XML и создает иерархию объектов, каждый из которых наследуется от класса Node, со списками дочерних элементов и ссылкой на родительский узел.

Мне нужно было иметь возможность скопировать эту структуру. Концепция заключается в том, что исходная структура содержит данные по умолчанию, и вы можете получить свою собственную копию и изменить ее во время использования. Поэтому я использовал общий метод расширения DeepClone , чтобы сделать это с BinaryFormatter .

Мой вопрос, хотя я чувствую, что уже знаю (и боюсь), каков ответ, состоит в том, оставляет ли этот подоконник проблему переназначения ссылок на все эти родительские и дочерние узлы?


Отказ от ответственности: Когда я закончу это, я осознаю все ошибки в дизайне, которые я сделал, и как их можно было избежать, включая эту. В мою защиту, этот семестр в университете будет в первый раз, когда я беру класс структур данных. ;) Я полностью ожидаю, что будет какая-то жизненно важная часть дерева, которую я не смог реализовать и которая поможет решить эту проблему. > _ <</p>

1 Ответ

1 голос
/ 03 сентября 2010

Нет. Процесс сериализации записывает ссылки между объектами, а процесс десериализации восстанавливает эти отношения.

РЕДАКТИРОВАТЬ: если я не понял ваш вопрос - не совсем понятно, что вы имели в виду. Как только клиентский код внес изменения в клонированную структуру, вы можете включить эти изменения в основную структуру данных, если это то, что вы хотите сделать.

Возможно, вы захотите взглянуть на IEditableObject для более формализованного способа обработки подобных вещей. Вы можете продолжать использовать сериализацию в качестве средства клонирования объекта до редактирования, но ваш интерфейс будет более стандартизированным.

...