ホームページ  >  記事  >  バックエンド開発  >  必要なデータ メンバーが見つからないため、C# Json 逆シリアル化データ コントラクト タイプを逆シリアル化できません

必要なデータ メンバーが見つからないため、C# Json 逆シリアル化データ コントラクト タイプを逆シリアル化できません

黄舟
黄舟オリジナル
2017-02-15 11:37:221428ブラウズ

背景 今日使用したもの: 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) に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。