WCF передает коллекцию нескольких типов - PullRequest
1 голос
/ 04 октября 2009

Должны ли быть проблемы с передачей такого рода коллекции в WCF?

class Parent
{
  [DataMember]
  // some data members

  [DataMember]
  Child myChild;    
}

class Child : Parent
{
  [DataMember]     
  // some more data members

  [DataMember]
  Parent myParent;
}

Должны ли быть проблемы с передачей списка Parent?

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

Ответы [ 2 ]

1 голос
/ 04 октября 2009

Прежде всего, вам нужно поставить [DataContract] на каждый класс, который вы хотите сериализовать и десериализовать с помощью WCF - он не автоматически наследуется!

[DataContract]
class Parent
{
   .....
}

[DataContract]
class Child : Parent
{
   .....
}

Если вы имеете дело с коллекциями вещей, то вам может потребоваться проверить CollectionDataContract:

[CollectionDataContract]
[KnownType(typeof(Parent))]
[KnownType(typeof(Child))]
public class CustomCollection : List<Parent>
{
}

Кроме того, WCF и SOA в целом немного отличаются от ООП и не очень хорошо справляются с наследованием. Скорее всего, вам придется помещать атрибуты [ServiceKnownTypes] или [KnownType] в контракты на обслуживание в тех местах, где вы хотите использовать и поддерживать полиморфизм.

Таким образом, если у вас есть сервисный метод, который принимает Parent, но также должен иметь возможность принимать и экземпляр Child, тогда вам нужно украсить метод атрибутом [KnownType], чтобы сделать эту информацию доступной в WCF.

См. Документацию MSDN в атрибуте KnownType или ознакомьтесь с другим SO вопросом по теме.

Марк

0 голосов
/ 04 октября 2009

Я бы рекомендовал добавить IsReference и KnownType к вашим классам, как показано ниже:

[DataContract(IsReference = true)]
[KnownType(typeof(Child))]
class Parent
{
  [DataMember]
  some data members

  [DataMember]
  Child myChild;
}

[DataContract(IsReference = true)]
class Child : Parent
{
  [DataMember]
  some more data members

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