【发布时间】:2010-10-31 01:01:31
【问题描述】:
我需要将一些以 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' 不是 找到了。”
【问题讨论】:
-
你能举个例子说明你的意思吗?
-
@John Saunders - 假设我有一个名为“Cat”的 JavaScript 对象,其中有一个名为“Name”的字段,其值为“Whiskers”。假设这是用 JSON 表示的。我想获取这个 JSON 并将其序列化为 C# Cat 类的实例(由我编写),以便序列化过程用“Whiskers”填充实例的自动属性“Name”。
-
...但问题是序列化程序正在寻找支持字段(例如“
k_backingField”但不一定使用此名称“)而不是“名称”。 -
你用的是什么序列化器?
-
另外,我没用过这个,但也许你应该使用 [DataContract] 和 [DataMember] 而不是 [Serializable]?
标签: c# .net json serialization automatic-properties