一尘不染

JSON的C#自动属性反序列化

json

我需要反序列化一些JSON表示的JavaScript对象为适当的C#类。鉴于自动属性的出色功能,我宁愿将它们放在这些类中,而不是仅包含字段。不幸的是,.NET序列化引擎(至少默认情况下)完全忽略了反序列化的自动属性,而只关心背景字段,而该字段显然不在JavaScript对象中。

鉴于没有标准的方法来命名后备字段并且说实话,我什至不想使用“让我们创建一个看起来像具有C#后备字段的JavaScript对象”的方法,因为这听起来有点脏,这是唯一的方法如果可以强制序列化引擎以某种方式忽略后备字段并直接使用该属性,则可以将JavaScript字段序列化为C#自动属性。不幸的是,我不知道该如何完成或者是否可以完成。任何想法,将不胜感激。

编辑 :这是一个示例:

Javascript:

function Cat()
{
    this.Name = "Whiskers";
    this.Breed = "Tabby";
}
var cat = new Cat();

然后将其序列化为“ {Name:’Whiskers’}“。

C#类:

[Serializable()]
public class Cat
{
    public string Name { get; set; }
    public string Breed { get; set; }
}

反序列化代码失败了:

new DataContractJsonSerializer(typeof(Cat)).ReadObject(inputStream);

从例外可以明显看出它失败了,因为它正在寻找支持字段。

EDIT2 :这是例外,如果有帮助(无内部例外):

System.Runtime.Serialization.SerializationException

“数据合同类型’Test.Cat’无法反序列化,因为<Name>k__BackingField, <Breed>k__BackingField未找到所需的数据成员’ ‘。”


阅读 252

收藏
2020-07-27

共1个答案

一尘不染

这里发生的是反序列化程序试图猜测您的后备字段的名称。您可以通过添加如下所示的显式映射(DataContract / DataMember属性)来解决此问题:

[DataContract]
public class Cat
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Breed { get; set; }
}
2020-07-27