Когда целесообразно использовать атрибут CoveryType?

StackOverflow https://stackoverflow.com/questions/3167932

  •  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
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top