簡體   English   中英

.NET XmlSerializer和C#中的嵌套類

[英].NET XmlSerializer and nested classes in C#

我在C#中使用XmlSerializer遇到了一些令人驚訝的行為。 考慮以下代碼。

public class A : IEnumerable
{
    public class B
    {
        [XmlAttribute]
        public string PropA { get; set; }
        [XmlElement]
        public string PropB { get; set; }
    }

    public IEnumerator GetEnumerator ()
    {
        yield break;
    }
}

class Program
{
    static void Main (string[] args)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(A.B));

        XmlTextWriter writer = new XmlTextWriter(@"E:\temp\test.xml", Encoding.Default);
        serializer.Serialize(writer, new A.B() { PropA = "one", PropB = "two" });
    }
}

在這個例子中,我嘗試序列化嵌套類AB的實例,它本身不以任何方式使用容器類A. 但是當我嘗試為它構造XmlSerializer時,拋出以下異常:

InvalidOperationException未處理:

要成為XML可序列化,從IEnumerable繼承的類型必須在其繼承層次結構的所有級別都具有Add(System.Object)的實現。 Test.A沒有實現Add(System.Object)。

當我實際嘗試序列化類型AB時,XmlSerializer正在嘗試對類型A應用序列化約束我的理解是,除了在外部類型的實例中對數據的特權訪問之外,嵌套類型不是特殊的並且表現得好像它是在命名空間中。

這種理解是不正確的,並且嵌套類型或XmlSerializer的語義是否證明了這種行為,或者這是否像XmlSerializer中的錯誤一樣?

特別是對於XmlSerializer語義,是否有任何文檔要求在針對嵌套類型應用時對所有外部類型強制執行XmlSerializer約束?

http://msdn.microsoft.com/en-us/library/vstudio/ms229027%28v=vs.100%29.aspx

由於嵌套類型被視為聲明類型的成員,因此嵌套類型可以訪問聲明類型中的所有其他成員。

因此,如果序列化器想要使用AB,它也需要A的定義。 IEnumerable驗證開始的地方。

B實際上沒有引用A中的任何東西都沒關系:)

IEnumerable就是這里的約束。 如果您按照異常的建議添加Add方法,那么您的代碼將正常工作。 同樣,這與XmlSerialization沒什么關系,而且與IEnumerable的工作方式有關。 如果我在這里,請糾正我。 檢查一下是一個很好的討論。

XmlSerializer為實現IEnumerable或ICollection的類提供特殊處理。

更多細節: XmlSerializer和IEnumerable:序列化可能沒有參數構造函數:Bug?

可能這在序列化運行時是一個非常難的問題,但我對這種行為沒有任何好的解釋。 我覺得IEnumerable的限制不適用於B類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM