Проблема сериализации Silverlight WCF с DataContract (IsReference = true) - PullRequest
1 голос
/ 21 апреля 2010

У меня есть Silverlight 3 UI, который обращается к службам WCF, которые, в свою очередь, обращаются к репозиториям, использующим NHibernate. Чтобы преодолеть некоторые проблемы отложенной загрузки NHibernate с WCF, я использую свой собственный суррогат DataContract, как описано здесь: http://timvasil.com/blog14/post/2008/02/WCF-serialization-with-NHibernate.aspx. Здесь я устанавливаю preserveObjectReferences = true

Моя модель содержит циклы (т. Е. Клиент с IList [Заказ])

Когда я получаю объект из моего сервиса, он работает нормально, однако, когда я пытаюсь отправить этот же объект обратно в сервис wcf, я получаю сообщение об ошибке:

System.ServiceModel.CommunicationException был не обработан кодом пользователя Сообщение = Произошла ошибка во время пытается сериализовать параметр http://tempuri.org/:searchCriteria. Сообщение InnerException было «Объект graph ... 'содержит циклы и не может быть сериализованным, если ссылки не отслеживаются. Рассмотрите возможность использования DataContractAttribute с Для свойства IsReference установлено значение true. '

Так что циклические ссылки теперь являются проблемой в Silverlight, поэтому я пытаюсь изменить свой DataContract на [DataContract (IsReference = true)], но теперь, когда я пытаюсь извлечь объект из моего сервиса, я получаю следующее исключение:

System.ExecutionEngineException было обработано сообщение = исключение тип 'System.ExecutionEngineException' был брошен. InnerException:

Есть идеи?

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Это ошибка в Silverlight 3 и WCF в .Net 3.5.

Я сейчас обновился до .Net 4 и Silverlight 4, и все (циклические ссылки и возвращение типов интерфейсов из WCF) прекрасно работают вместе!

0 голосов
/ 21 апреля 2010

Использовали ли вы IsReference = true как на клиенте, так и на сервере?

Я решил эту проблему Джеймсом Ковачем, я выложу ссылку здесь:

Один вариант

И это лучшее решение:

Чтобы включить циклические ссылки для области действия или службы, вы можете использовать пользовательское поведение и т. Д. По сути, вам нужна возможность подключиться к процессу создания экземпляров сериализатора и создать экземпляр с использованием вышеуказанной перегрузки:

  1. Данные подклассаContractSerializerOperationBehavior

  2. Метод Ovverride CreateSerializer

  3. Создание нового экземпляра DCS, передающего значение true параметру preserveObjectReferences.

из Здесь

...