我有一些标准的ASP.NET网络方法,我是从javascript调用的,参数是自定义类的形式
[DataContract]
[KnownType(typeof(MyOtherSubclass))]
public class MyClass
{
[DataMember]
public MyOtherClass MyMember { get; set; }
}
其中MyOtherClass
是标有Serializable
但没有DataContract
属性的类(我无法控制其生成)。有几个MyOtherClass
的子类,例如MyOtherSubclass
:
[Serializable]
public class MyOtherSubClass : MyOtherClass
{
private string valueField;
public string Value
{
get { return valueField; }
set { valueField = value; }
}
}
当我使用DataContractJsonSerializer直接序列化MyClass的对象时,我得到类似于
的结果{ "MyMember" : { "__type" : "MyOtherSubClass:#Namespace", "valueField" : "xxx" } }
但是,当我将这样的JSON传递给来自javascript的web方法请求时,我在反序列化时遇到异常。我进行了一些实验,发现使用下面的代替
{ "MyMember" : { "___type" : "Namespace.MyOtherSubClass", "Value" : "xxx" } }
反序列化没有任何问题。
有没有办法以这样的方式配置DataContractJsonSerializer,它会以第二种形式生成JSON,以便Web方法参数反序列化可以工作?
答案 0 :(得分:1)
ASP.NET WebMethods使用JavaScriptSerializer,因此请尝试使用它进行序列化。您可能需要自定义类型解析程序才能包含此属性:
public class Parent
{
public string ParentProp { get; set; }
}
public class Child: Parent
{
public string ChildProp { get; set; }
}
public class CustomResolver : JavaScriptTypeResolver
{
public override Type ResolveType(string id)
{
return Type.GetType(id);
}
public override string ResolveTypeId(Type type)
{
return type.ToString();
}
}
class Program
{
static void Main(string[] args)
{
var o = new Child
{
ParentProp = "parent prop",
ChildProp = "child prop",
};
var serializer = new JavaScriptSerializer(new CustomResolver());
var s = serializer.Serialize(o);
Console.WriteLine(s);
}
}