無法序列化型別 請考慮以 DataContractAttribute 屬性標記該型別

  • 939
  • 0

無法序列化型別 請考慮以 DataContractAttribute 屬性標記該型別

我是在使用WebAPI 含 OData 技術,方法回傳 IEnumerable<SomeClass 或  List<SomeClass>的時候,網頁顯示這個錯誤

<StackTrace/>
<InnerException>
<Message>An error has occurred.</Message>
<ExceptionMessage>
無法序列化型別 'Test.ModelObject.TestObj'。請考慮以 DataContractAttribute 屬性標記該型別,並以 DataMemberAttribute 屬性標記該型別要序列化的所有成員。如果該型別是集合,請考慮以 CollectionDataContractAttribute 標記該型別。如需其他支援型別,請參閱 Microsoft .NET Framework 文件。
</ExceptionMessage>

 

之前不會這樣,經過一些嘗試,我發現單純的class如果只有屬性不會有這個問題

    public class TestObj
    {
        public int Id { get; set; }

        public bool IsEnabled { get; set; }

        public string Text { get; set; }
    }

 

一但加上建構式,就會出現這個問題  (我猜 只要加上任何方法都會導致這個問題,可能是在序列化的時候,只要偵測到類別中含有方法,會不確定怎麼序列化,例如要不要把方法也序列化,所以就會報這個錯)

    public class TestObj
    {
        public TestObj(int id, bool isEnabled, string text)
        {
            Id = id;
            IsEnabled = isEnabled;
            Text = text;
        }
        
        public int Id { get; set; }

        public bool IsEnabled { get; set; }

        public string Text { get; set; }
    }

 

最後我依照訊息給的解法,在類別名稱上面加上  [DataContract]  ,在屬性加上 [DataMember] ,問題就解決了!

    [DataContract]
    public class TestObj
    {
        public TestObj(int id, bool isEnabled, string text)
        {
            Id = id;
            IsEnabled = isEnabled;
            Text = text;
        }        
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public bool IsEnabled { get; set; }
        [DataMember]
        public string Text { get; set; }
    }