無法序列化型別 請考慮以 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; }
}