我需要将一些用JSON表示的JavaScript对象反序列化为适当的C#类。考虑到自动属性的良好特性,我更喜欢将它们放在这些类中,而不是仅仅拥有字段。不幸的是,.NET序列化引擎(至少在默认情况下)完全忽略反序列化时的自动属性,只关心支持字段,该字段显然不存在于JavaScript对象中。
既然有no standard way to name backing fields,老实说,我甚至不想为“让我们创建一个看起来像有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
’。”
发布于 2009-06-03 17:38:34
这里发生的事情是,反序列化程序正在尝试猜测支持字段的名称。您可以通过添加显式映射(DataContract/DataMember属性)来解决此问题,如下所示:
[DataContract]
public class Cat
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Breed { get; set; }
}
发布于 2009-06-03 16:20:59
您可以使用System.Web.Script.Serialization
名称空间中的JavaScriptSerializer
执行此操作:
JavaScriptSerializer serializer = new JavaScriptSerializer();
Cat c = serializer.Deserialize<Cat>(jsonString);
我有自动属性的POCO对象,这很好用。
编辑:我写了关于JSON Serializers in .NET的文章,它将这个序列化程序与DataContractJsonSerializer
进行了比较。
发布于 2010-01-29 20:56:16
baretta's answer为我解决了k__BackingField的膨胀问题。只是一个很小的附录,你可以装饰这个类,以类似的方式自动序列化为XML或JSON:
[Serializable, XmlRoot, DataContract]
public class Cat
{
[XmlElement]
[DataMember]
public string Name { get; set; }
[XmlElement]
[DataMember]
public string Breed { get; set; }
}
..。然后使用DataContractJsonSerializer或XmlSerializer为您的端点做好准备。
https://stackoverflow.com/questions/945585
复制相似问题