C# Json反序列化 資料協定型別 無法反序列化 因為未找到必需的資料成員

衣舞晨風發表於2015-08-17
背景今天在使用: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]標識。



相關文章