从BindingList 派生的类的公共字段/属性不会序列化

我正在尝试序列化一个派生自BindingList(Floor)的类 ,其中Floor是一个只包含属性Floor.Height的简单类

这是我class级的简化版

[Serializable] [XmlRoot(ElementName = "CustomBindingList")] public class CustomBindingList:BindingList { [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:

     " 

如何将“publicField”或“publicProperty”序列化?

XML序列化以特定方式处理集合,并且从不序列化集合的字段或属性,仅序列化项目。

你可以:

  • 实现IXmlSerializable自己生成和解析XML(但这是很多工作)
  • 将BindingList包装在另一个类中,在该类中声明自定义字段(由speps建议)

这里简短的回答是,.NET通常希望某些东西可以作为集合xor来获得属性。 这体现在以下几个地方:

  • xml序列化; 集合的属性未序列化
  • 数据绑定; 您无法将数据绑定到集合上的属性,因为它隐式地将您带到第一个项目

在xml序列化的情况下,如果你认为它可能只是客户端的SomeType[]SomeType[] ……额外的数据会去哪里?

常见的解决方案是封装集合 – 即而不是

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

通常我不会在集合属性上set ,但XmlSerializer要求它…

这是XML序列化和从集合inheritance的已知问题。

你可以在这里阅读更多信息: 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 Floors = new BindingList(); } 

这意味着你可以使用Floors.Add添加楼层,你会得到你想要的结果,但是,我没有尝试过。 请记住,使用属性是XML序列化的关键。