2010-02-14 26 views
5

我想将XML序列化添加到C#中相当平凡的类结构。从本质上讲,有一个根类(称之为ACLASS),其中包含一些其他类的几个实例列表的单个实例(称之为AnotherClass):用内部修饰符声明的类的Serialize List <>?

[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特性 - 如果列表中声明internal它不序列AnotherClass可言。

我试图使大会的内部可见的串行:

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

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

+0

+1的问题,因为假设是性能必须是公众*,因为这是我们一直在说*。有时候我想我们中的很多人会停下来,因为我们被告知,如果不寻求替代方案,我们就无法做到。 – IAbstract

回答

6

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

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

+0

我不知道那个工具!从我+1。 –

+0

+1 @Thomas:这很好理解。你自己试过这个吗? – IAbstract

+0

而且,顺便说一句...为什么'InternalsVisibleTo'属性在这种情况下不起作用的很好的解释! – IAbstract

1

添加InternalsVisibleTo属性的想法很好,但我认为问题在于Xml序列化代码仅查找程序集中的公共类型。
据我所知,没有办法让XmlSerializer序列化或反序列化内部类型,你必须将类型声明为public或者编写自己的序列化代码。
此外,XmlSerializer class documentation明确指出对象的唯一公共属性将被序列:“XML序列化是将一个对象的公共属性和字段为串行格式的过程(在这种情况下,XML),用于储存或运输”,所以它看起来像是一个设计决定。

+0

实际上序列化内部成员正常工作......(见我的答案) –

+0

是可能的序列化的内部类型与XmlSerializer的,但在这种情况下,你将不得不对特定类型实现IXmlSerializable的编写自己的自定义类型的串行器(和类型本身必须公开)。 – Steven