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