2010-02-14 39 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