2010-11-27 18 views
0

J'ai deux ou trois méthodes Web ASP.NET standard que je vous appelle de javascript avec un paramètre qui est d'une classe personnalisée sous formeComment s'assurer que la sérialisation et la désérialisation avec WebServices est symétrique?

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

MyOtherClass est une classe marquée avec Serializable mais pas avec DataContract attribut (je n'ai pas de contrôle sur sa génération). Il y a quelques sous-classes de MyOtherClass, par ex. MyOtherSubclass:

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

Lorsque j'utilise le DataContractJsonSerializer pour sérialiser un objet de MyClass directement, je reçois un résultat similaire à

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

Cependant, quand je passe un tel JSON dans la méthode Web demande javascript , Je reçois une exception pendant la désérialisation. Je l'ai expérimenté un peu et a constaté que lors de l'utilisation la suivante au lieu

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

le désérialisation fonctionne sans aucun problème.

Y a-t-il un moyen de configurer le DataContractJsonSerializer de manière à ce qu'il produise le JSON dans le second formulaire, de sorte que la désérialisation des arguments de la méthode Web puisse fonctionner?

Répondre

1

ASP.NET WebMethods utilise JavaScriptSerializer, essayez donc la sérialisation avec. Vous pouvez avoir besoin d'un résolveur de type personnalisé pour inclure cette propriété:

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