2009-08-04 47 views
2

我試圖序列,從的BindingList(樓),其中是一個簡單的類僅包含一個屬性樓派生的類。身高公共字段/從的BindingList <T>派生類的屬性不會連載

這是我班的簡化版

[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」 或「公物序列化以及

+0

從幾乎任何系統集合類派生是*非常糟糕的主意*。實現一個不擴展的接口。 – ShuggyCoUk 2009-08-04 13:25:50

+1

我不想從IBindingList派生,因爲它不是泛型的,而且我不喜歡非泛型集合,因爲每次我想要做某些事情時,必須將其轉換爲真實的對象類型。 – 2009-08-04 16:03:15

回答

2

XML序列化以特定方式處理集合,並且從不序列化集合的字段或屬性,只有項目。

你既可以:

  • 實現IXmlSerializable的生成和解析自己的XML(但它是一個大量的工作)
  • 包裝您的BindingList另一個類,其中聲明您的自定義字段(如通過speps建議)
1

這是已知的問題與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序列化的關鍵。

3

這裏簡短的回答是,.NET普遍預計的東西集合XOR有prope rties。這體現在幾個地方:

  • xml serialization;集合的屬性不會被序列化
  • 數據綁定;你不能將數據綁定到集合的屬性,因爲它含蓄地把你的第一個項目,而不是

在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<...> 
} 

通常我不會對一個集合屬性set,但XmlSerializer有人需要它...