Ссылка на цикл сериализации ошибок WCF - PullRequest
3 голосов
/ 09 июня 2011

Я пытаюсь вернуть списки объектов, которые имеют ссылки на другие объекты и наоборот.

Я только хочу, чтобы ленивая загрузка получала «детей первого уровня», я имею в виду, если у меня есть объект «Person» со свойством «Place», я хочу, чтобы загружались данные места, но не каждый объект в » Помещение "объект" должно быть загружено ... потому что это приведет к циклической ссылке ...

Я прочитал, что могу сделать это, используя [DataContract (IsReference = true)] для каждого объекта.

Я установил для каждого объекта в модели (автоматически сгенерированного EF) это оформление, но при попытке отправить его обратно вызывающей стороне службы все еще не удается.

Я что-то упустил? Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 09 июня 2011

Я успешно использовал [DataContract(IsReference=true)] для решения проблемы циклической зависимости в прошлом. По общему признанию они не были объектами, произведенными EF, но я не уверен, насколько это должно иметь значение.

Какая именно ошибка?

Неужели график становится большим?

Может ли быть так, что ваши объекты - это не одинаковые экземпляры, а разные экземпляры концептуально одного типа?

Так, когда ваш TypeA-instance1 получает сериализацию и имеет ссылку на TypeB-instance1, который имеет ссылку на TypeA-instance1, два фактических объекта TypeA-instance1 не сравниваются равными, поэтому сериализатор не пытается повторно использовать ссылки?

Вы можете переопределить метод equals для ваших объектов и провести некоторое тестирование на равенство, основываясь на свойствах вашего объекта, а не на адресе памяти по умолчанию, который будет использоваться.

4 голосов
/ 09 июня 2011

Я имею в виду, если у меня есть объект "Персона" со свойством "Place", я хочу размещать данные для загрузки, но не каждый объект в "месте" объект должен быть нагруженный ...

Это невозможно при использовании отложенной загрузки. Как только объект будет сериализован, сериализатор получит доступ к каждому отдельному свойству. Доступ к каждому свойству навигации приведет к отложенной загрузке, и сериализатор продолжит работу с загруженными свойствами => он всегда будет сериализовать полный граф объектов. В вашем сценарии это может означать:

  1. Сериализатор запустится с Person, который имеет свойство навигации до Place
  2. Ленивая загрузка загрузит Place и сериализатор будет сериализован.
  3. Если Place имеет свойство навигации для всех Persons, то отложенная загрузка сработает и загрузит всех людей, ссылающихся на Place!
  4. Сериализатор начнет сериализацию каждого загруженного Person - если IsReference установлен на false, вы получите исключение с циклами в графе объектов. Если нет, то это создаст огромное сообщение.

Это очень простое объяснение того, что происходит, если вы пытаетесь сериализовать объект при использовании отложенной загрузки. Если у ваших сущностей есть другие свойства навигации, такой же эффект произойдет для них. В худшем случае вы можете легко создать операцию, которая попытается извлечь и сериализовать все данные из базы данных. Это, скорее всего, приведет к тайм-ауту.

Есть еще одна проблема с отложенной загрузкой. Сериализация происходит вне области действия. Поэтому, если вы закроете / утилизируете ObjectContext в операции, вы получите исключение, когда объект запускает отложенную загрузку.

Не используйте отложенную загрузку при отображении объектов в WCF и не используйте DTO для управления тем, какие данные следует передавать из операции.

1 голос
/ 09 июня 2011

Возможно, вы захотите преобразовать дерево объектов в другие плоские объекты и вернуть их вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...