我正在尝试将XML序列化添加到C#中相当简单的类结构中。本质上,有一个根类的实例(称为AClass),它包含一些其他类的几个实例的List(称之为AnotherClass):
[XmlRoot("RootNode")]
public class AClass {
[XmlElement("ListNode")]
internal List otherObjects { get; set; }
}
public class AnotherClass {
[XmlAttribute("Name")]
internal string name { get; set; }
}
序列化时,我希望将这两个类序列化在一起 - 也就是说,如果我序列化了AClass,它的AnotherClass列表也会被序列化(参见this question)。
我主要使用它,但问题是在序列化期间,XmlSerializer似乎只想处理类的public
属性 - 如果列表被声明,它根本不会序列化AnotherClass {{ 1}}。
我尝试让程序集的内部对序列化程序可见:
internal
这似乎没有做任何事情。有没有办法让XmlSerializer递归序列化内部声明的对象列表?
答案 0 :(得分:6)
你走在正确的轨道上...除了System.Xml不执行实际的序列化,而是由动态生成的程序集执行。您无法预测该程序集的名称(它是随机生成的),因此您无法在InternalsVisibleTo
属性中使用它。
唯一的解决方案是预生成XML序列化程序集。您可以使用XML Serializer Generator Tool (Sgen.exe)执行此操作。生成的程序集的名称将是“YourAssembly.XmlSerializers”;这是您必须在InternalsVisibleTo
属性中使用的名称。
答案 1 :(得分:1)
添加InternalsVisibleTo
属性的想法很好,但我认为问题是Xml序列化代码只查找程序集中的公共类型。
据我所知,没有办法让XmlSerializer序列化或反序列化内部类型,你必须将类型声明为public或编写自己的序列化代码。
此外,XmlSerializer class documentation明确指出只有对象的公共属性才会被序列化:“XML序列化是将对象的公共属性和字段转换为串行格式(在本例中为XML)以进行存储或传输的过程“所以它看起来确实是一个设计决定。