Как обеспечить симметричность сериализации и десериализации с помощью WebServices? - PullRequest
0 голосов
/ 27 ноября 2010

У меня есть пара стандартных веб-методов 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, я получаю исключение при десериализации.Я немного поэкспериментировал и обнаружил, что при использовании следующего

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

десериализация работает без проблем.

Есть ли способ настроить DataContractJsonSerializer таким образом, чтобыон будет производить JSON во второй форме, чтобы десериализация аргументов веб-метода работала?

1 Ответ

1 голос
/ 27 ноября 2010

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