Позвольте мне начать с иллюстративного примера (предположим, что реализация выполняется на статически типизированном языке, таком как Java или C#).Дизайн классов для сериализации - идеи или шаблоны?
Предположим, что вы создаете систему управления контентом (CMS) или что-то подобное. Данные иерархически организованы в Folder
с. В каждой папке есть коллекция детей; ребенок может быть Page
или Folder
. Все элементы хранятся в корневой папке. Никаких циклов не допускается. У нас есть ациклический граф.
Система будет иметь удаленный API, а экземпляры Folder
и Page
должны быть сериализованы/де-сериализованы по сети. При типичной реализации папки, в которой дети папки являются List
, сериализация корневого узла отправит весь граф. Это неприемлемо по очевидным причинам.
Мне интересно услышать, как люди решили эту проблему в прошлом.
У меня есть два потенциальных предложения:
- Навигация по запросу: Измените модель предметной области, так что класс папки содержит только список идентификаторов для каждого ребенка. Чтобы получить доступ к ребенку, мы должны запросить его. Сериализация теперь тривиальна, так как граф заканчивается в четко определенной точке. Основной недостаток заключается в том, что мы теряем безопасность типа - идентификатор может быть для чего-то другого, кроме папки/ребенка.
- Остановить и снова подключить: при остановке сериализации, когда мы обнаруживаем ссылку на папку или страницу, отправьте идентификатор. При де-сериализации мы должны искать соответствующий объект для каждого идентификатора и снова присоединять его в соответствующем положении в зарождающемся объекте.