Сериализация WCF и прокси NHibernate для одного объекта - PullRequest
3 голосов
/ 17 ноября 2011

Предположим, что существует сущность NHibernate "School" со свойством "Manager", которое ссылается на одну сущность типа "Person".

Для того, чтобы быть "готовым к WCF", Персона украшена DataContractAtrribute. Отображение Fluent NH для School.Manager References(s => s.Manager). Когда сущность типа «Школа» отправляется клиенту WCF, я получаю исключение со следующим сообщением:

«Тип« Castle.Proxies.PersonProxy »не может быть ISerializable и иметь атрибут DataContractAttribute»

Теперь это происходит только при обращении к одной сущности (а не через коллекцию). Мой обходной путь - отключить прокси, добавив .Not.LazyLoad() к предложению References.

Кто-нибудь сталкивался с этой проблемой или имел какие-либо идеи, как ее решить?

Спасибо, Elad

Ответы [ 2 ]

3 голосов
/ 17 ноября 2011

Когда вы решили не загружать ссылочные объекты с нетерпением , NHibernate создаст динамические прокси (так что объект может быть инициализирован в какой-то момент в будущем). Это стандартное поведение.

Теперь для списка объектов NHibernate будет использовать одну из своих прокси-коллекций (например, PersistentGenericBag). Поскольку тип коллекции известен, его можно сериализовать. Что происходит, когда он приближается к вашему классу сущностей? Он будет генерировать динамический прокси на основе вашего типа, который не будет сериализуемым (благодаря динамическому характеру во время выполнения).

Это встроенный механизм, и я не думаю, что с этим можно что-то сделать. Тем не менее, у вас есть два решения этой проблемы:

  • используя Not.LazyLoad(), как вы делаете сейчас, для принудительного создания экземпляра
  • альтернативно, вы можете установить Manager на null перед отправкой через веб-сервис. В любом случае, вы не будете использовать прокси на стороне клиента (так как сессия уже давно пройдет).
2 голосов
/ 17 ноября 2011

Расширяя ответ jimmy_keen, есть несколько других опций

  • Установить fetchmode в eager for Reference при загрузке до сериализации
  • Скопировать объект домена в объекты DTO- / message для отправкипо проводам (хорошая практика, чтобы иметь больше контроля над тем, что происходит по проводам)
  • реализация IDataContractSurrogate см. здесь
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...