У меня есть работающая реализация ChangeTrackingList, которая прекрасно справляется со своей работой, но я бы хотел «отфильтровать» ее содержимое при отправке с клиента обратно на сервер, чтобы он включал только изменения. Получить изменения легко, поскольку мой список предоставляет метод GetChanges именно для этой цели. Как я могу прервать DataContractSerializer и заменить List.GetChanges (), где раньше был List?
Подробнее:
Рассмотрим отношения родитель / потомок, в которых у меня есть один родитель с несколькими потомками, у каждого из которых есть ссылка на родителя, например, Customer / Orders. Сериализация всего дочернего списка в клиентском приложении - это хорошо, так как мне нужно показать все заказы. Однако при сохранении я не хочу возвращать все заказы на сервер, а только изменения.
Сложность:
Я уже смотрел на реализацию ISerializable и на реализацию своего собственного GetObjectData, что было бы не очень сложно, если бы не тот факт, что мне нужно также сохранять ссылки на объекты. Если я укажу DataContractSerializer на свой график и включу PreserveObjectReferences (добавив поведение или явно через конструктор), я получу очень хороший график без дублирования, но он захочет включить весь мой ChangeTrackingList. Если я реализую ISerializable, я могу выписать свой ChangeTrackingList вручную и включать только изменения, но эти дочерние объекты больше не будут знать своих родительских ссылок.
Пояснение:
Это очень упрощенный пример, предназначенный для иллюстрации проблемы. Я не ищу альтернативных решений этой конкретной проблемы. Моя реальная проблема никоим образом не связана с клиентами, заказами или позициями. Альтернативные решения проблемы Заказчик / Заказ - это не те ответы, которые я ищу.
Я просто ищу способ сериализации только "интересных" частей графа объектов. Механизм идентификации и фильтрации «интересного» уже сделан, мне просто нужен способ заместить эти части в граф объекта во время сериализации.
Другой пример:
Допустим, у нас есть сущность «Персона», под которой находится коллекция сущностей «Телефон». Телефоны недействительны без родителя, и бизнес-правила гласят, что Лицо недействительно без хотя бы одного телефона. Я не могу просто сохранить человека, а затем телефоны в двух отдельных звонках, потому что каждый звонок будет ошибкой. Я должен сохранить их в виде графика в один вызов. Позже, если я обновлю Person, чтобы изменить его адрес, который хранится в Person, и добавлю новый номер телефона, мне нужно отправить обновленного лица, а также изменения в список телефонов. Я не хочу отправлять оригинальный телефон, потому что он не изменился.
Это снова надуманный пример, но он больше напоминает реальную проблему. У меня есть родители, которые являются недействительными без хотя бы одного ребенка, и ни один ребенок не является действительным без родителей.
Обновление:
Похоже, что «подстановка», которую я хочу выполнить, может быть выполнена с помощью класса DataContractSurrogate. Я видел несколько примеров этого, и они относительно просты, но это потому, что их примеры тоже. Обычно они относятся к категории «Поменять местами суррогат сотрудника», где «Сотрудник» - это не несериализуемый класс. В моем случае все становится страннее, потому что класс, который я хочу поменять, является универсальным типом.
Итак, более простая версия проблемы может быть такой. Допустим, у меня есть полностью не сериализуемый класс MyList. (И прежде чем кто-то предложит это, замена класса MyList также не является допустимым решением. Помните, ребята, это всего лишь пример.) Я хочу настроить DataContractSurrogate, чтобы всякий раз, когда MyList появлялся в моем графе объектов, я хотел преобразовать это простой массив для сериализации.
Это звучит как правильное направление для кого-либо? Кто-нибудь когда-нибудь пытался заменить родовой тип? Я сошел с ума, даже подумав об этом?