2010-11-27 4 views
0

Ich habe ein paar Standard ASP.NET Web-Methoden, die ich mit einem Parameter von Javascript aufrufen, dieWie kann sichergestellt werden, dass die Serialisierung und Deserialisierung mit WebServices symmetrisch ist?

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

wo MyOtherClass ist eine Klasse, die mit Serializable aber nicht mit DataContract in Form einer benutzerdefinierten Klasse ist Attribut (Ich habe keine Kontrolle über seine Generation). Es gibt ein paar Unterklassen von MyOtherClass, z.B. MyOtherSubclass:

[Serializable] 
public class MyOtherSubClass : MyOtherClass 
{ 
    private string valueField; 
    public string Value 
    { 
     get { return valueField; } 
     set { valueField = value; } 
    } 
} 

Wenn ich die DataContractJsonSerializer verwenden, um ein Objekt von MyClass direkt serialisiert werden, erhalte ich ein ähnliches Ergebnis wie

{ "MyMember" : { "__type" : "MyOtherSubClass:#Namespace", "valueField" : "xxx" } } 

Allerdings, wenn ich eine solche JSON in die Web-Methode Anfrage von Javascript passieren Ich bekomme eine Ausnahme beim Deserialisieren. Ich habe ein wenig experimentiert und herausgefunden, dass, wenn die folgenden ein anstelle

{ "MyMember" : { "___type" : "Namespace.MyOtherSubClass", "Value" : "xxx" } } 

die Deserialisierung ohne Probleme funktioniert.

Gibt es eine Möglichkeit, den DataContractJsonSerializer so zu konfigurieren, dass er den JSON in der zweiten Form erzeugt, so dass die Deserialisierung der Webmethoden-Argumente funktionieren würde?

Antwort

1

ASP.NET WebMethods verwenden Sie JavaScriptSerializer, versuchen Sie es damit Serialisierung. Möglicherweise benötigen Sie einen benutzerdefinierten Typ-Resolver, um diese Eigenschaft einzuschließen:

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