2008-10-23 2 views
2

Позвольте мне начать с иллюстративного примера (предположим, что реализация выполняется на статически типизированном языке, таком как Java или C#).Дизайн классов для сериализации - идеи или шаблоны?

Предположим, что вы создаете систему управления контентом (CMS) или что-то подобное. Данные иерархически организованы в Folder с. В каждой папке есть коллекция детей; ребенок может быть Page или Folder. Все элементы хранятся в корневой папке. Никаких циклов не допускается. У нас есть ациклический граф.

Система будет иметь удаленный API, а экземпляры Folder и Page должны быть сериализованы/де-сериализованы по сети. При типичной реализации папки, в которой дети папки являются List, сериализация корневого узла отправит весь граф. Это неприемлемо по очевидным причинам.

Мне интересно услышать, как люди решили эту проблему в прошлом.

У меня есть два потенциальных предложения:

  1. Навигация по запросу: Измените модель предметной области, так что класс папки содержит только список идентификаторов для каждого ребенка. Чтобы получить доступ к ребенку, мы должны запросить его. Сериализация теперь тривиальна, так как граф заканчивается в четко определенной точке. Основной недостаток заключается в том, что мы теряем безопасность типа - идентификатор может быть для чего-то другого, кроме папки/ребенка.
  2. Остановить и снова подключить: при остановке сериализации, когда мы обнаруживаем ссылку на папку или страницу, отправьте идентификатор. При де-сериализации мы должны искать соответствующий объект для каждого идентификатора и снова присоединять его в соответствующем положении в зарождающемся объекте.

ответ

1

Я не знаю, какой API вы пытаетесь построить, но ваше предложение # 1 похоже на то, что рекомендуется для служб стиля REST и API. В принципе, объект Folder будет содержать список URL-адресов для его детей.

0

Предположим, вы моделируете все дерево с каждым элементом, являющимся узлом, специализациями «Узел, являющийся папкой» и «umm», «Лист». У вас есть «корневой» узел. Узлы имеют методы

canHaveChildren() 
getChildren() 

Листовые узлы имеют очевидные поведения (даже не нужно попасть в сеть)

папки getChildren() получить следующий набор узлов.

Я разработал систему с регенерирующими услугами по этим линиям. Считается, что его легко программировать.

0

Навигация по запросу раствор был использован для NFS. Прочитав свой вопрос, он смотрит на меня, как будто вы пытаетесь самостоятельно реализовать файловую систему.

Если вы ищете специально для отправки объектов по сети, всегда есть CORBA. Кроме того, есть DCOM и новее WCF. Но подождите больше, чем RMI. Кроме того, есть Web Services. Я сейчас остановлюсь.

0

Я бы не сделал это методом навигации по запросу. Просто потому, что я хотел бы придерживаться модели домена, где папки содержат папки или страницы.

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

Я бы предположил, что вы вводите и размещаете как FolderBowser в своей модели, которая принимает идентификатор и дает вам список содержимого папки. Это упростит ваши сервисные операции.

Приветствие, Unmesh

0

Классическое решение, вероятно, использовать proxy pattern, где некоторые из графика передаваемые по сети и некоторые из папки заменены на прокси, которые не будут иметь свои списки дети заполняются до тех пор, пока не будут опрошены. Круглосуточная поездка на сервер занимает значительное количество времени, и, вероятно, это приведет к слишком большому количеству запросов, если все папки являются прокси-серверами (это даст новый запрос каждый раз, когда содержимое папки будет проверено), поэтому вы хотите пойти некоторые компромиссы между размером каждого фрагмента данных и количеством запросов сервера, необходимых в типичном сценарии. Это, конечно же, конкретное приложение, но отправка содержимого всех дочерних папок на примере глубины 2 может быть полезной стратегией ...

Краткая история коротких: Что, вероятно, будет работать лучше всего, это ваше решение № 1 с исключение, которое вы хотите отправить более чем одной папке за раз из-за накладных расходов на поездку на сервер ...

Смежные вопросы