Pregunta

Después de leer la referencia de MSDN, todavía tengo dudas acerca de cómo utilizar el atributo KnownType. Yo entiendo que el atributo se comunica información de tipo para el serializador, pero cuando es esto necesario? ¿Es apropiado cuando la clase siendo serializado tiene referencias de un tipo de clase base, y hay hasta fundido a clases de derivados que pudieran ponerse a esas referencias?

Por otra parte, ¿hay inconvenientes para el uso excesivo del atributo? Por ejemplo, en el ejemplo anterior, si la clase serializada fue marcado con KnownType (BaseClass), aunque no había una referencia explícita a ese tipo?

¿Fue útil?

Solución

Se necesita

[KnownType] contarla sobre subtipos. La desventaja de no su uso es que el siguiente no funcionará:

[DataContract]
class Foo {}

[DataContract]
class Bar : Foo {}

con un método en la interfaz WCF que los rendimientos:

public Foo GetFoo() { return new Bar(); }

Sin el atributo, el serializador (especialmente para los tipos mex / generada proxy) no saber sobre Bar , y se producirá un error. Con el atributo:

[DataContract, KnownType(typeof(Bar))]
class Foo {}

trabajo. Esto sólo se aplica a DataContractSerializer -. NetDataContractSerializer se obtiene con los datos del tipo de una manera diferente

Otros consejos

Si está utilizando XSD "herencia" en su esquema.

Tienes al revés; la KnownTypeAttribute se aplica a la clase base y los nombres de todas las clases derivadas que podrían ser pasados ??como una referencia a la base.

Por ejemplo:

...
KnownType(typeof(POBoxAddress))
KnownType(typeof(StreetAddress))
KnownType(typeof(SingleLineAddress))
KnownType(typeof(ParsedAddress))
public abstract class AddressBase
{
    ...
}

Es necesario el atributo KnownType cuando se está serializando tipos no concretas, tales como interfaces o clases base. El serializador WCF debe saber acerca de todas las posibles implementaciones de la interfaz o clase heredada. Cualquier implementación que no conoce causarán una excepción de serialización.

Un uso possable se puede encontrar en este

También es útil para los casos, como a continuación:

[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 un objeto de otra persona decir clase. a continuación, todo esto para trabajar hay que añadir el knownType (typeof (persona))

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top