背景今天在使用: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]标识。