【问题标题】:JSON Serialization/Deserialization mismatch (ASP.Net)JSON 序列化/反序列化不匹配 (ASP.Net)
【发布时间】:2023-04-09 06:20:02
【问题描述】:

当我在页面中调用 PageMethod 时,序列化对象如下所示: {"d":{"__type":"MyAsembly.MyNamespace.Person","Name":"ulu","Age":40}}

这对 Javascript 来说没问题,但我的 .Net 反序列化器无法理解它:

var result= new JavaScriptSerializer(new SimpleTypeResolver()).Deserialize<Person>(source);

抛出 System.InvalidOperationException:由于对象的当前状态,操作无效。

现在,实际问题是 Activator 无法创建结果对象:它不理解“MyAsembly.MyNamespace.Person”,需要“MyAsembly.MyNamespace.Person, MyAssembly”。

问题是,我需要更改什么才能使序列化与反序列化兼容?

非常感谢 乌鲁

【问题讨论】:

    标签: json serialization


    【解决方案1】:

    似乎您已经知道答案:在 JavaScript 端序列化对象之前修改 __type 属性的值。或者,您可以在将序列化数据推送到反序列化器之前对其进行替换。

    但问题是:被序列化的数据在哪里?如果您在 .NET 中执行此操作,然后将其发送到客户端,则当它返回服务器时不需要进行任何修改,除非有人篡改了 __type 属性。

    【讨论】:

    • 我不能修改它,我使用 PageMethods 并且只返回一个 Person 实例。
    • 在那种情况下,没有足够的信息来反序列化它是很奇怪的。当你说不能修改的时候,你试过用 JavaScript 吗?我问是因为 JavaScript 没有私有字段的概念,所以 person.__type = 'MyAssembly.MyNamespace.Person, MyAssembly' 实际上应该毫无问题地更新该字段。顺便说一句,您的目标是哪个版本的 .NET?刚刚查看了 3.5 的文档,发现 JavaScriptSerializer 已被弃用,取而代之的是 System.Runtime.Serialization.DataContractJsonSerializer
    • 好的,这是我的情况。我正在为 Asp.Net 测试(Ivonna)构建一个框架,我目前的想法是让人们测试页面方法。因此,我无法控制对象的序列化方式。框架获取序列化的字符串并尝试将其反序列化。在这一点上,我确实可以控制字符串并且能够修改它。我不能使用 JavaScript,所以我必须手动解析它。至于 DataContractJsonSerializer,它不能反序列化使用 JavaScriptSerializer 序列化的字符串(尽管已弃用,但在页面方法结果序列化中使用)
    【解决方案2】:

    我猜

    {"d":{"__type":"MyAsembly.MyNamespace.Person","Name":"ulu","Age":40}}
    

    应该是

    {"d":{"__type":"MyAssembly.MyNamespace.Person","Name":"ulu","Age":40}}
    

    【讨论】:

    • 糟糕,这只是一个错字。关键是,你不能构造一个调用 Activator.CreateInstance("MyAssembly.MyNamespace.Person") 的对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多