簡體   English   中英

從BindingList派生的類的公共字段/屬性 <T> 不會序列化

[英]Public fields/properties of a class derived from BindingList<T> wont serialize

我正在嘗試序列化一個從BindingList(Floor)派生的類,其中Floor是一個僅包含屬性Floor.Height的簡單類。

這是我班的簡化版

[Serializable]
[XmlRoot(ElementName = "CustomBindingList")]
public class CustomBindingList:BindingList<Floor>
{
    [XmlAttribute("publicField")]
    public string publicField;
    private string privateField;

    [XmlAttribute("PublicProperty")]
    public string PublicProperty
    {
        get { return privateField; }
        set { privateField = value; }
    }
}

我將使用以下代碼序列化CustomBindingList的實例。

XmlSerializer ser = new XmlSerializer(typeof(CustomBindingList));
StringWriter sw = new StringWriter();

CustomBindingList cLIst = new CustomBindingList();

Floor fl;

fl = new Floor();
fl.Height = 10;
cLIst.Add(fl);

fl = new Floor();
fl.Height = 10;    
cLIst.Add(fl);

fl = new Floor();
fl.Height = 10;
cLIst.Add(fl);

ser.Serialize(sw, cLIst);

string testString = sw.ToString();

然而,上面的testString最終被設置為以下XML:

<CustomBindingList xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
    <Floor Height="10" />
    <Floor Height="10" />
    <Floor Height="10" />
</CustomBindingList>"

如何獲取“ publicField”或“ publicProperty”進行序列化?

簡短的回答是,.NET通常期望某物成為具有屬性的xor集合。 這體現在幾個地方:

  • xml序列化; 集合的屬性未序列化
  • 數據綁定; 您無法將數據綁定到集合的屬性,因為它隱式地將您帶到第一項

在xml序列化的情況下,如果您認為它可能只是客戶端上的SomeType[] ,那是有道理的...多余的數據會放在哪里?

常見的解決方案是封裝集合-即而不是

public class MyType : List<MyItemType> // or BindingList<...>
{
    public string Name {get;set;}
}

public class MyType
{
    public string Name {get;set;}
    public List<MyItemType> Items {get;set;} // or BindingList<...>
}

通常我不會在collection屬性上set一個集合,但是XmlSerializer要求它...

XML序列化以特定方式處理集合,並且從不對集合的字段或屬性(僅對項目)進行序列化。

您可以:

  • 實現IXmlSerializable來自己生成和解析XML(但這是很多工作)
  • 將BindingList包裝在另一個類中,在其中聲明您的自定義字段(如speps所建議)

這是XML序列化和從集合繼承的已知問題。

您可以在此處閱讀更多信息: http : //social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/0d94c4f8-767a-4d0f-8c95-f4797cd0ab8e

您可以嘗試這樣的事情:

[Serializable]
[XmlRoot]
public class CustomBindingList
{
    [XmlAttribute]
    public string publicField;
    private string privateField;

    [XmlAttribute]
    public string PublicProperty
    {
        get { return privateField; }
        set { privateField = value; }
    }

    [XmlElement]
    public BindingList<Floor> Floors = new BindingList<Floor>();
}

這意味着您可以使用Floors.Add添加樓層,您將獲得想要的結果,但是,我沒有嘗試過。 請記住,使用屬性是XML序列化的關鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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