2010-11-27 19 views
0

我有幾個是我從JavaScript調用帶有參數是一個自定義類的形式如何確保WebServices的序列化和反序列化是對稱的?

[DataContract] 
[KnownType(typeof(MyOtherSubclass))] 
public class MyClass 
{ 
    [DataMember] 
    public MyOtherClass MyMember { get; set; } 
} 

標準ASP.NET Web方法,其中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

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