[英]NewtonSoft JSON converter serializes but does it weirdly. How to fix?
[英]Newtonsoft Serializes Hidden Inherited Members
在具有類繼承的UWP項目中使用Newtonsoft.Json 11.0.2,我們希望能夠序列化父類而不序列化基類,並且我們還希望能夠序列化其他調用中的基類屬性。 我們將該問題重新應用於示例...
[DataContract]
public class Object1
{
[DataMember]
public string Property1
{
get { return "Property 1 data"; }
}
[DataMember]
public string Property2
{
get { return "Property 2 data"; }
}
[DataMember]
public string Property3
{
get { return "Property 3 data"; }
}
}
[DataContract]
public class Object2 : Object1
{
[DataMember]
public string Property4
{
get { return "Property 4 data"; }
}
[DataMember]
public string Property5
{
get { return "Property 5 data"; }
}
[DataMember]
public string Property6
{
get { return "Property 6 data"; }
}
[IgnoreDataMember]
public new string Property2
{
get { return "Property 2 data"; }
}
}
序列化對象...
Object2 myobject = new Object2();
string serialized = JsonConvert.SerializeObject(myobject);
結果...
{“ Property4”:“ Property 4數據”,“ Property5”:“ Property 5數據”,“ Property6”:“ Property 6數據”,“ Property2”:“ Property 2數據”,“ Property1”:“ Property 1數據” ,“ Property3”:“屬性3數據”}
即使Property2設置為隱藏和/或忽略,它也會被序列化。
我希望序列化Object2不會顯示Property2,因為使用new關鍵字“隱藏”了Property2,並且未使用DataMember進行設置和/或沒有明確地忽略它。
刪除它或將其設為私有並不能解決問題,因為我們確實希望能夠使用該屬性序列化基類。
如果您不想序列化object2中的Property2
,但仍想序列化object1中的Property2
。 您的原始代碼應該可以工作。 我相信您應該對Property2
的相同值感到困惑。 您可以只更改object2中Property2
的值來區分。
[DataContract]
public class Object2 : Object1
{
[DataMember]
public string Property4
{
get { return "Property 4 data"; }
}
[DataMember]
public string Property5
{
get { return "Property 5 data"; }
}
[DataMember]
public string Property6
{
get { return "Property 6 data"; }
}
[IgnoreDataMember]
public new string Property2
{
get { return "new Property 2 data"; }
}
}
Object2 myobject = new Object2();
string serialized = JsonConvert.SerializeObject(myobject);
結果: {"Property4":"Property 4 data","Property5":"Property 5 data","Property6":"Property 6 data","Property2":"Property 2 data","Property1":"Property 1 data","Property3":"Property 3 data"}
您會看到它只是序列化了object1中的Property2
。
感謝XavierXie-MSFT指出我無法區分正在序列化的對象的區別,因為兩個對象中的數據相同。 如我所料,原始示例將從基類序列化屬性。 這不是一個答案,只能更清楚地說明我的觀點,但這確實有助於我進一步分析。
為了獲得所需的行為,我必須將基類Property2設為虛擬,並重寫父類中的屬性。 在這種情況下,Property2仍從父類進行序列化。 然后我更改為使用newtonsoft序列化忽略[JasonIgnore]。 然后,當實例化為Object2類型時,Property2不再從任何一個類進行序列化。
我本來希望躲藏在new上會有相同的結果。
我本來希望[IgnoreDataMember]會像[JsonIgnore]那樣忽略覆蓋的Property2。
我本來希望,如果父類中Property2上沒有標簽,則重寫的Property2將不會序列化。
幸運的是,虛擬化和[JsonIgnore]都能正常工作。
解:
[DataContract]
public class Object1
{
public Object1()
{
Property1 = "property 1 data from object 1";
Property2 = "property 2 data from object 1";
Property3 = "property 3 data from object 1";
Property0 = "should not be serialized from object 1";
}
public string Property0
{
get;
set;
}
[DataMember]
public string Property1
{
get;
set;
}
[DataMember]
public virtual string Property2
{
get;
set;
}
[DataMember]
public string Property3
{
get;
set;
}
}
[DataContract]
public class Object2 : Object1
{
public Object2()
{
Property4 = "property 4 data from object 2";
Property5 = "property 5 data from object 2";
Property6 = "property 6 data from object 2";
Property2 = "should not be serialized from object 2";
Property7 = "should not be serialized from object 2";
}
[DataMember]
public string Property4
{
get;
set;
}
[DataMember]
public string Property5
{
get;
set;
}
[DataMember]
public string Property6
{
get;
set;
}
/// <summary>
/// from parent class
/// </summary>
[JsonIgnore]
public override string Property2
{
get;
set;
}
public string Property7
{
get;
set;
}
}
Object2 myobject = new Object2();
string serialized = JsonConvert.SerializeObject(myobject);
Object1 mybaseobject = new Object1();
string baseserialized = JsonConvert.SerializeObject(mybaseobject);
結果:
序列化的{“ Property4”:“來自對象2的屬性4數據”,“ Property5”:“來自對象2的屬性5數據”,“ Property6”:“來自對象2的屬性6數據”,“ Property1”:“來自屬性2的屬性1數據object 1“,” Property3“:”來自對象1的屬性3數據“}
baseserialized {“ Property1”:“來自對象1的屬性1數據”,“ Property2”:“來自對象1的屬性2數據”,“ Property3”:“來自對象1的屬性3數據”}
注意:即使使用[IgnoreDataMember],C#UWP DataContractSerializer仍將從父類序列化Property2。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.