Сериализация объектов Службы WCF

У меня есть один абстрактный класс с именем contact и другой класс с именем client, который наследуется от contact. Я имею дело со Службой WCF с методом, который принимает параметр типа contact. однако у меня есть экземпляр клиента, который я хочу передать. Im сталкивается с этой ошибкой:

введите ' xxx.Клиент "с именем контракта данных" клиент: http: / / schemas.datacontract.org/2004/07/xxx ' не ожидается. Добавлять любые типы не статически в список известных типов например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, передаваемых DataContractSerializer.

3 ответов


WCF напрямую не работает с абстрактными классами. Атрибуты KnownType следует использовать в классе datacontract или service. ниже приведены примеры;

[DataContract]
[KnownType(typeof(Client))]
public class Contact
{
   ...
}

[ServiceContract]
[ServiceKnownType(typeof(Client))]
public interface IMyService
{
    contact getcontact(Guid id);
}

вы нед, чтобы DataContractSerializer знал, что a Client тип Contact.

есть несколько способов сделать это, но все они вращаются вокруг использования KnownType или ServiceKnownType атрибуты.

на KnownType можно поместить на Client класс, чтобы сообщить DataContractSerializer, что это известный тип Contact.

[DataContract]
[KnownType(typeof(Client))]
public class Contact{}

на KnownType можно также поместить на типе для указания этого когда сериализуя этот класс, вы также можете столкнуться с этим другим классом.

вы можете сделать это, если у вас есть DataContract класс, который имеет свойство, которое является Contact который может фактически содержать Client:

[DataContract]
[KnownType(typeof(Client))]
public class Meeting
{
    Contact MeetingContact{get;}
}

в этом случае вы можете уйти, не указав KnownType на клиенте. Вы также можете сделать это, если у вас есть свойство, которое возвращает коллекцию, и вы хотите указать типы, которые могут быть в коллекции.

вы может вместо указания фактического типа KnownType указать имя статического метода, который будет возвращать известные типы:

[DataContract]
[KnownType("GetKnownTypes")]
public class Meeting
{
    Contact MeetingContact{get;}

    private static Type[] GetKnownType()
    {
    return new Type[]{typeof(Client)};
    }
}

вы также можете указать известный тип через конфигурационный файл.

ServiceKnownTypes работают аналогичным образом, но указываются на самом сервисе:

[ServiceKnownType(typeof(Client))]
[ServiceContract()]
public interface IMyServiceContract
{

    [OperationContract]
    Contact GetContact();
}

Эта настройка позволит DataContactSerializer знать, что любой из методов может возвращать тип типа Client. Аналогично известным типам можно также использовать статический метод для предоставления службы известных типов.


использовать [KnownType] и [ServiceKnownType] атрибуты для обеспечения связи.