Когда целесообразно использовать атрибут CoveryType?
-
02-10-2019 - |
Вопрос
После прочтения ссылки MSDN у меня все еще есть вопросы, когда использовать атрибут SevelyType. Я понимаю, что атрибут сообщает информацию о типе для сериализатора, но когда это необходимо? Стоит ли целесообразно, когда сериализованный класс имеет ссылки на базовый тип классов, и возникают прочные классы, которые могут быть установлены на эти ссылки?
Кроме того, есть ли какие-либо недостатки, чтобы опровергнуть атрибут? Например, в предыдущем примере, если сериализованный класс был отмечен известным NewyPe (BaseClass), даже если был явная ссылка на этот тип?
Решение
[KnownType]
Нужно рассказать об подтипах. Недостатком нет Используя это, что следующее не будет работать:
[DataContract]
class Foo {}
[DataContract]
class Bar : Foo {}
С методом на интерфейсе WCF, который возвращает:
public Foo GetFoo() { return new Bar(); }
Без атрибута сериализатор (особенно для MEX / прокси-генерируемых типов) не узнает о Bar
, и это потерму неудачу. С атрибутом:
[DataContract, KnownType(typeof(Bar))]
class Foo {}
Это буду работай. Это только относится к DataContractSerializer
- с участием NetDataContractSerializer
Вы получаете данные типа по-другому.
Другие советы
Если вы используете XSD «Наследование» в вашей схеме.
Вы получили его назад; SevidatyPeattribute применяется к базовому классу и имена всех полученных классов, которые могут быть переданы в качестве ссылки на базу.
Например:
...
KnownType(typeof(POBoxAddress))
KnownType(typeof(StreetAddress))
KnownType(typeof(SingleLineAddress))
KnownType(typeof(ParsedAddress))
public abstract class AddressBase
{
...
}
Атрибут SewiveType необходим при сериализации небетонных типов, таких как интерфейсы или базовые классы. Serializer WCF должен знать обо всех возможных реализациях интерфейса или унаследованного класса. Любые реализации, о которых она не знает, вызовет исключение сериализации.
Одно возможно использование можно найти в этом Поэтому вопрос
Это также полезно для случаев, таких как ниже:
[DataContract]
[knownType(typeof(Person))]
public class KeyValue
{
[DataMember]
public string key {get; set;}
[DataMember]
public string value {get; set;}
// rest of the code
}
Теперь предполагаю, что значение содержит какой-то объект другого класса, говорящего человека. Тогда это все работать, вы должны добавить известностьетеп (тип (человек))