Сериализация объектов Службы 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] атрибуты для обеспечения связи.