c# - ¿Cuándo es apropiado usar el atributo KnownType?
wcf known-types (4)
Después de leer la referencia de MSDN, todavía tengo preguntas sobre cuándo usar el atributo KnownType. Entiendo que el atributo comunica información de tipo al serializador, pero ¿cuándo se necesita? ¿Es apropiado cuando la clase que se serializa tiene referencias de un tipo de clase base, y hay clases derivadas up-cast que se pueden establecer en esas referencias?
Además, ¿hay algún inconveniente para usar en exceso el atributo? Por ejemplo, en el ejemplo anterior, si la clase serializada estaba marcada con KnownType (baseClass) aunque hubiera una referencia explícita a ese tipo.
El atributo KnownType es necesario cuando serializa tipos no concretos, como interfaces o clases base. El serializador WCF debe conocer todas las posibles implementaciones de la interfaz o clase heredada. Cualquier implementación que no conozca causará una excepción de serialización.
Un uso possable se puede encontrar en esta pregunta SO
Si está usando XSD "herencia" en su esquema.
Lo tienes al revés; KnownTypeAttribute se aplica a la clase base y nombra todas las clases derivadas que se pueden pasar como referencia a la base.
Por ejemplo:
...
KnownType(typeof(POBoxAddress))
KnownType(typeof(StreetAddress))
KnownType(typeof(SingleLineAddress))
KnownType(typeof(ParsedAddress))
public abstract class AddressBase
{
...
}
También es útil para casos como los siguientes:
[DataContract]
[knownType(typeof(Person))]
public class KeyValue
{
[DataMember]
public string key {get; set;}
[DataMember]
public string value {get; set;}
// rest of the code
}
ahora supongamos que el valor contiene algún objeto de otra clase, digamos Persona. entonces, todo esto para trabajar, tienes que agregar el tipo conocido (typeof (Person))
[KnownType]
es necesario para contarle sobre subtipos. La desventaja de no usarlo es que lo siguiente no funcionará:
[DataContract]
class Foo {}
[DataContract]
class Bar : Foo {}
con un método en la interfaz WCF que devuelve:
public Foo GetFoo() { return new Bar(); }
Sin el atributo, el serializador (especialmente para los tipos mex / proxy-generated) no sabrá sobre Bar
, y fallará. Con el atributo:
[DataContract, KnownType(typeof(Bar))]
class Foo {}
Funcionará Esto solo se aplica a DataContractSerializer
: con NetDataContractSerializer
obtiene los datos de tipo de una manera diferente.