This page describe las circunstancias bajo las cuales se emite la propiedad __type. En resumen, en WCF, si usa un tipo derivado y un KnownTypeAttribute, obtendrá una propiedad __type.
Ejemplo:
Asumir
[DataContract]
[KnownType(typeof(Subscriber))]
public class Person { ... }
[DataContract]
public class Subscriber : Person { ... }
Este código genera una propiedad __type:
var o = new Subscriber("Fleming");
var serializer = new DataContractJsonSerializer(typeof(Person));
serializer.WriteObject(Console.OpenStandardOutput(), o);
Pero este código no:
var o = new Subscriber("Fleming");
var serializer = new DataContractJsonSerializer(typeof(Subscriber));
serializer.WriteObject(Console.OpenStandardOutput(), o);
en cuenta que el segundo recorte usa una D CJS con el mismo tipo que el objeto que se serializa.
Para evitar el __type, no use los tipos derivados, o para ser precisos, use un serializador tipeado al tipo que realmente está serializando. Si la serialización se realiza implícitamente por un método WCF, entonces el método debe escribirse apropiadamente. En mi ejemplo, significa que debe usar un tipo de devolución de "Suscriptor", y no el tipo principal, "Persona".
El tipo __ se transmite a la secuencia JSON mediante el método (privado) WriteServerTypeAttribute en la clase (interna) System.Runtime.Serialization.Json.XmlJsonWriter. No hay una manera pública, documentada y respaldada de modificar eso, hasta donde yo sé.
Para evitar esto, tal vez necesite devolver una cadena del método WCF, realice la serialización usted mismo, y postprocesar el JSON emitido.
Si no le importa lo __type, pero sólo desea eliminar el espacio de nombres de calificación del valor, a continuación, poner sus tipos en el espacio de nombres global. En otras palabras, colóquelos fuera de cualquier declaración namespace
en el código.
Ejemplo: Cuando los tipos de datos residen en un espacio de nombres, y cuando he usado un tipo derivado, el número de serie JSON se ve así:
{
"__type":"Subscriber:#My.Custom.Namespace",
"Index":604455,
"Name":"Fleming",
"Id":580540
}
Cuando los tipos de datos residen en el espacio de nombres global, parece que esto:
{
"__type":"Subscriber:#",
"Index":708759,
"Name":"Fleming",
"Id":675323
}
Envío sin el espacio de nombres parece muy hacky , sin embargo, o simplemente lo dejé por completo, o no lo hice ... – Nyerguds
@Nyerguds depende de tus prioridades ... si, por ejemplo, te comunicas con un dispositivo con un ancho de banda extremadamente bajo, tienes que hacer compensaciones ... –