反序列化

反序列化的时候出现了下面的错误信息

  • System.Runtime.Serialization.SerializationException: 数据协定类型“TestEntity”无法反序列化,由于未找到必需的数据成员“multipleChoice, runTimeDisplayColumns”。
  • 在 System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)

详细原因

  • 我在反序列化的实体类中新加了两个属性

    1. private bool multipleChoice;
    2. /// <summary>
    3. /// 帮助引擎是否同意多选
    4. /// </summary>
    5. [XmlIgnore]
    6. [Browsable(false)]
    7. public bool MultipleChoice
    8. {
    9. get
    10. {
    11. return multipleChoice;
    12. }
    13. set
    14. {
    15. multipleChoice = value;
    16. }
    17. }
    18. private string runTimeDisplayColumns;
    19. /// <summary>
    20. /// 帮助引擎执行时显示的列
    21. /// </summary>
    22. [XmlIgnore]
    23. [Browsable(false)]
    24. public string RunTimeDisplayColumns
    25. {
    26. get
    27. {
    28. return runTimeDisplayColumns;
    29. }
    30. set
    31. {
    32. runTimeDisplayColumns = value;
    33. }
    34. }
  • 在使用之前保存的Json串反序列化的时候,新增的两个两个属性。没有相应的值,所以报出了上面的错误。

解决方法

  • 通过DataMember(IsRequired = false)属性表面此属性,不是必须的。这样的话,保证了在反序列化的时候,即使JSON串内缺少该属性的定义能正常反序列化
  • 在属性上添加DataMember(IsRequired = false)后,对应的类上必须添加 [DataContract]标识
  1. [DataContract]
  2. public class TestEntity
  3. {
  4. private bool multipleChoice;
  5. /// <summary>
  6. /// 帮助引擎是否同意多选
  7. /// </summary>
  8. [XmlIgnore]
  9. [Browsable(false)]
  10. [DataMember(IsRequired = false)]
  11. public bool MultipleChoice
  12. {
  13. get
  14. {
  15. return multipleChoice;
  16. }
  17. set
  18. {
  19. multipleChoice = value;
  20. }
  21. }
  22. private string runTimeDisplayColumns;
  23. /// <summary>
  24. /// 帮助引擎执行时显示的列
  25. /// </summary>
  26. [XmlIgnore]
  27. [Browsable(false)]
  28. [DataMember(IsRequired = false)]
  29. public string RunTimeDisplayColumns
  30. {
  31. get
  32. {
  33. return runTimeDisplayColumns;
  34. }
  35. set
  36. {
  37. runTimeDisplayColumns = value;
  38. }
  39. }
  40. }