Это должно решить.
В частном методе SerializeValue JavaScriptSerializer в System.WebExtensions.dll,
__type добавляется во внутренний словарь, если его можно разрешить.
От отражателя:
private void SerializeValue(object o, StringBuilder sb, int depth, Hashtable objectsInUse)
{
if (++depth > this._recursionLimit)
{
throw new ArgumentException(AtlasWeb.JSON_DepthLimitExceeded);
}
JavaScriptConverter converter = null;
if ((o != null) && this.ConverterExistsForType(o.GetType(), out converter))
{
IDictionary<string, object> dictionary = converter.Serialize(o, this);
if (this.TypeResolver != null)
{
string str = this.TypeResolver.ResolveTypeId(o.GetType());
if (str != null)
{
dictionary["__type"] = str;
}
}
sb.Append(this.Serialize(dictionary));
}
else
{
this.SerializeValueInternal(o, sb, depth, objectsInUse);
}
}
Если тип не может быть определен, сериализация будет продолжена, но тип будет игнорироваться. Хорошей новостью является то, что, поскольку анонимные типы наследуют getType (), а возвращаемые имена динамически генерируются компилятором, TypeResolver возвращает ноль для ResolveTypeId, а атрибут «__type» впоследствии игнорируется.
Я также на всякий случай воспользовался советом Джона Моррисона с внутренним конструктором, хотя, используя только этот метод, я все еще получал свойства __type в своем ответе JSON.
//Given the following class
[XmlType("T")]
public class Foo
{
internal Foo()
{
}
[XmlAttribute("p")]
public uint Bar
{
get;
set;
}
}
[WebService(Namespace = "http://me.com/10/8")]
[System.ComponentModel.ToolboxItem(false)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class MyService : System.Web.Services.WebService
{
//Return Anonymous Type to omit the __type property from JSON serialization
[WebMethod(EnableSession = true)]
[System.Web.Script.Services.ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
public object GetFoo(int pageId)
{
//Kludge, returning an anonymois type using link, prevents returning the _type attribute.
List<Foo> foos = new List<Foo>();
rtnFoos.Add( new Foo(){
Bar=99
}};
var rtn = from g in foos.AsEnumerable()
select g;
return rtn;
}
}
Примечание: Я использую унаследованный преобразователь типов JSON, который считывает атрибуты сериализации XML из сериализованных типов для дальнейшего сжатия JSON. Благодаря CodeJournal . Работает как шарм.