![](/img/trans.png)
[英]Serializing derived class from BindingList and ISerializable interface
[英]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序列化的情況下,如果您認為它可能只是客戶端上的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序列化以特定方式處理集合,並且從不對集合的字段或屬性(僅對項目)進行序列化。
您可以:
這是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.