5

我正在尝试将 XML 序列化添加到 C# 中一个相当简单的类结构中。本质上,有一个根类的单个实例(称为 AClass),它包含一些其他类的几个实例的列表(称为另一个类):

[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类的属性 - 如果声明了列表,它根本不会序列化 AnotherClass internal

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

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

那似乎没有任何作用。有没有办法让 XmlSerializer 递归序列化声明为内部的对象列表?

4

2 回答 2

6

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

唯一的解决方案是预先生成 XML 序列化程序集。您可以使用XML 序列化程序生成器工具 (Sgen.exe)来做到这一点。生成的程序集的名称将是 "YourAssembly.XmlSerializers" ;这是您必须在InternalsVisibleTo属性中使用的名称。

于 2010-02-14T22:12:48.957 回答
1

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

于 2010-02-14T22:11:36.010 回答