簡體   English   中英

Newtonsoft序列化隱藏的繼承成員

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM