背景今天在使用:C# Json 序列化与反序列化
详细原因是:我在反序列化的实体类中新加了两个属性:
反序列化的时候出现了以下的错误信息。
System.Runtime.Serialization.SerializationException: 数据协定类型“TestEntity”无法反序列化,由于未找到必需的数据成员“multipleChoice, runTimeDisplayColumns”。 在 System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
详细原因是:我在反序列化的实体类中新加了两个属性:
private bool multipleChoice; /// <summary> /// 帮助引擎是否同意多选 /// </summary> [XmlIgnore] [Browsable(false)] public bool MultipleChoice { get { return multipleChoice; } set { multipleChoice = value; } } private string runTimeDisplayColumns; /// <summary> /// 帮助引擎执行时显示的列 /// </summary> [XmlIgnore] [Browsable(false)] public string RunTimeDisplayColumns { get { return runTimeDisplayColumns; } set { runTimeDisplayColumns = value; } }
在使用之前保存的Json串反序列化的时候,新增的两个两个属性。没有相应的值,所以报出了上面的错误。
解决方法:
[DataContract] public class TestEntity { private bool multipleChoice; /// <summary> /// 帮助引擎是否同意多选 /// </summary> [XmlIgnore] [Browsable(false)] [DataMember(IsRequired = false)] public bool MultipleChoice { get { return multipleChoice; } set { multipleChoice = value; } } private string runTimeDisplayColumns; /// <summary> /// 帮助引擎执行时显示的列 /// </summary> [XmlIgnore] [Browsable(false)] [DataMember(IsRequired = false)] public string RunTimeDisplayColumns { get { return runTimeDisplayColumns; } set { runTimeDisplayColumns = value; } } }通过DataMember(IsRequired = false)属性表面此属性。不是必须的。
这种话。保证了在反序列化的时候。即使JSON串内缺少该属性的定义能正常反序列化。
小注:
在属性上加入DataMember(IsRequired = false)后。相应的类上必须加入 [DataContract]标识。