从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序列化的关键。