2014-02-27 66 views
14

我正在使用JSON.NET 6.0.1。當我使用SerializeObject方法序列化派生類的對象時,它僅序列化來自基類的屬性。以下是代碼片段:json.net不會序列化派生類的屬性

string v = JsonConvert.SerializeObject(
       service, 
       Formatting.Indented, 
       new JsonSerializerSettings() 
       { 
        TypeNameHandling = TypeNameHandling.All 
       }); 

基類:

[DataContract] 
public abstract partial class DataEntity : IDataEntity, INotifyPropertyChanging, INotifyPropertyChanged 
{ 
    ... 
} 

派生類:

[Table(Name = "dbo.mytable")] 
public sealed class mytable : DataEntity 
{ 
    ... 
} 

我缺少的東西?

回答

15

是的,你缺少的派生類[DataContract]屬性。如果您尚未添加它們,則還需要將[DataMember]添加到要序列化的任何屬性或字段。這是在documentation for the DataContractAttribute class拼寫,如下面引用(重點煤礦):

注意

數據協定在其繼承行爲的實際接口顯著不同。接口由任何派生類型繼承。 將DataContractAttribute應用於基類時,派生類型不會繼承該屬性或行爲。但是,如果派生類型具有數據協定,則將基類的數據成員序列化。但是,必須將DataMemberAttribute應用於派生類中的新成員以使其可序列化。

Json.Net更改爲在version 5.0 release 1(2013年4月)中兌現此行爲。

請注意,如果您刪除所有的從你的類[DataContract][DataMemeber]情況下,Json.Net表現不同:在這種情況下,默認行爲是Json.Net連載所有的公共屬性,無論是在基礎和派生類。

+0

感謝這篇文章。這個變化讓我們工作。 – lcryder

+0

有什麼方法可以改變這種行爲嗎? – JoelFan

+0

@JoelFan你必須更具體。 –

-1

JsonConvert.SerializeObject才返回{}我。我發現我需要在它正確序列化之前向類中添加一個新的構造函數。

相關問題