摘要:[Exception] InvalidDataContractException
DataContractSerializer是一個可以將物件序列化的一個類別,有時候建立要序列化的物件時,總會忘記一些序列化的規則,例如小弟這次剛好使用WriteObject方法就出現InvalidDataContractException,但可能無法立即從例外錯誤訊息視窗看出是什麼問題,也許檢視詳細資料沒有經驗的人還是看不出下面是發生什麼事情:
於 System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(String message, Type type)
於 System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type)
於 System.Runtime.Serialization.DataContract.GetDataContract(Int32 id, RuntimeTypeHandle typeHandle, SerializationMode mode)
於 System.Runtime.Serialization.DataContractSerializer.InternalWriteStartObject(XmlWriterDelegator writer, Object graph)
於 System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
於 System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
於 System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter writer, Object graph)
於 System.Runtime.Serialization.XmlObjectSerializer.WriteObject(Stream stream, Object graph)
但如果能掌握序列化規則的話,這些問題就容易迎刃而解,不過其實我不知道事實上使用DataContract(資料合約)所要注意的所有事項,在此只能分享一些已知的內容:
1. 若自訂建構式則必須要建立不含參數的建構式。
2. 請使用公用屬性(Public Properties)的方式做資料合約的資料存取。
目前我只想到這兩點,突然某天用上的時候,忘記這規則還讓自己多Debug幾分鐘,我想這次把經驗寫起來,以免未來又忘記。