如何确保WebServices的序列化和反序列化是对称的?

时间:2010-11-27 08:59:58

标签: c# asp.net web-services json serialization

我有一些标准的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方法参数反序列化可以工作?

1 个答案:

答案 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);
    }
}