序列化列表<>用内部修饰符声明的类?

时间:2010-02-14 21:50:13

标签: c# xml xml-serialization access-modifiers

我正在尝试将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递归序列化内部声明的对象列表?

2 个答案:

答案 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)以进行存储或传输的过程“所以它看起来确实是一个设计决定。