Эта страница описывает обстоятельства, при которых испускается свойство __type.Короче говоря, в WCF, если вы используете производный тип и KnownTypeAttribute, то вы получите свойство __type.
Пример:
Предположим,
[DataContract]
[KnownType(typeof(Subscriber))]
public class Person { ... }
[DataContract]
public class Subscriber : Person { ... }
Этот код генерирует свойство __type:
var o = new Subscriber("Fleming");
var serializer = new DataContractJsonSerializer(typeof(Person));
serializer.WriteObject(Console.OpenStandardOutput(), o);
Но этот код не:
var o = new Subscriber("Fleming");
var serializer = new DataContractJsonSerializer(typeof(Subscriber));
serializer.WriteObject(Console.OpenStandardOutput(), o);
Обратите внимание, что второй фрагмент использует DCJS с тем же типом, что и сериализуемый объект.
Чтобы избежать использования __type, не используйте производные типы или, если быть точным, используйте типизированный сериализаторк типу, который вы на самом деле сериализуете.Если сериализация выполняется неявно с помощью метода WCF, то метод должен быть напечатан соответствующим образом.В моем примере это означает, что вы должны использовать возвращаемый тип «Подписчик», а не родительский тип «Персона».
__type отправляется в поток JSON (частным) методом WriteServerTypeAttribute (внутреннего) класса System.Runtime.Serialization.Json.XmlJsonWriter.Насколько я могу судить, публичного, документированного и поддерживаемого способа его изменить не существует.
Чтобы избежать этого, вам, возможно, потребуется вернуть строку из метода WCF, выполнить сериализацию самостоятельно и постобработать выданный JSON.
Если вы не возражаете против __type, но просто хотите удалить подходящее пространство имен из значения, тогда поместите ваши типы в глобальное пространство имен.Другими словами, поместите их вне любого объявления namespace
в коде.
Пример: когда типы данных находятся в пространстве имен и когда я использовал производный тип, сериализованный JSON выглядит следующим образом:
{
"__type":"Subscriber:#My.Custom.Namespace",
"Index":604455,
"Name":"Fleming",
"Id":580540
}
Когда типы данных находятся в глобальном пространстве имен, это выглядит так:
{
"__type":"Subscriber:#",
"Index":708759,
"Name":"Fleming",
"Id":675323
}