序列化使用内部修饰符声明的类的List ?

我正在尝试将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列表也会被序列化(请参阅此问题 )。

我有这个主要工作,但问题是在序列化期间,XmlSerializer似乎只想处理类的public属性 – 如果列表被声明为internal它根本不会序列化AnotherClass。

我尝试使程序集的内部对序列化程序可见:

 [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Xml")] 

这似乎没有做任何事情。 有没有办法让XmlSerializer递归序列化内部声明的对象列表?

你是在正确的轨道上……除了System.Xml不执行实际的序列化,而是由动态生成的程序集执行。 您无法预测该程序集的名称(它是随机生成的),因此您无法在InternalsVisibleTo属性中使用它。

唯一的解决方案是预生成XML序列化程序集。 您可以使用XML Serializer Generator Tool(Sgen.exe)执行此操作 。 生成的程序集的名称将是“YourAssembly.XmlSerializers”; 这是您必须在InternalsVisibleTo属性中使用的名称。

添加InternalsVisibleTo属性的想法很好,但我认为问题是Xml序列化代码只查找程序集中的公共类型。
据我所知,没有办法让XmlSerializer序列化或反序列化内部类型,你必须将类型声明为public或编写自己的序列化代码。
此外, XmlSerializer类文档明确指出只有对象的公共属性才会被序列化:“XML序列化是将对象的公共属性和字段转换为串行格式(在本例中为XML)以进行存储或传输的过程”,所以看起来它确实是一个设计决定。