背景 今日使用したもの: C# Json のシリアル化と逆シリアル化
逆シリアル化中に次のエラー メッセージが表示されました。
System.Runtime.Serialization.SerializationException: 数据协定类型“TestEntity”无法反序列化,因为未找到必需的数据成员“multipleChoice, runTimeDisplayColumns”。 在 System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
具体的な理由は次のとおりです: 逆シリアル化されたエンティティクラスに 2 つの新しい属性を追加しました:
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 文字列は逆シリアル化されます この時点で、2 つは新たに追加された属性には対応する値がなかったため、上記のエラーが報告されました。
解決策:
[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] マークを対応するクラスに追加する必要があります。
その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。関連コンテンツの詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。