2010-12-18 50 views
11

我想序列化一個非常平凡,普通類,但美中不足的是它是嵌套在一個靜態類是這樣的:如何序列化非靜態子類的靜態類

public static class StaticClass 
{ 
    [Serializable] 
    public class SomeType 
    { 
     ... 
    } 
} 

此代碼:

StaticClass.SomeType obj = new StaticClass.SomeType(); 
XmlSerializer mySerializer = new XmlSerializer(typeof(obj)); 

產生以下錯誤:

StaticClass.SomeType cannot be serialized. Static types cannot be used as parameters or return types. 

這錯誤似乎完全不相干的; StaticClass.SomeType不是靜態類型。

有沒有辦法解決這個問題?我錯誤地認爲這個錯誤是愚蠢的?

+6

順便說一句,'[Serializable接口]'不添加任何東西這裏 - 「XmlSerializer」不使用它。 – 2010-12-18 19:55:25

+0

看起來像一個bug ... – 2010-12-18 19:56:45

+2

它已經在連接報告:https://connect.microsoft.com/VisualStudio/feedback/details/523204/class-that-is-nested-in-static-class-cannot -ex-xml-serialized – 2010-12-18 19:59:09

回答

8

作爲一個務實的解決辦法 - 沒有標記的嵌套式static

public class ContainerClass 
{ 
    private ContainerClass() { // hide the public ctor 
     throw new InvalidOperationException("no you don't"); 
    } 

    public class SomeType 
    { 
     ... 
    } 
} 
+0

作爲XmlSerializer限制的解決方法,這對我來說是最實用的。謝謝:) – tenfour 2010-12-18 20:12:34

+1

+1簡單有效。如果我要這樣做,我還會把這個班級標記爲密封。讓我想起舊的.NET 1天(密封類和私有構造函數) – RichardOD 2010-12-18 20:17:53

4

它知道limitation in XmlSerializer()

而解決方法是使用DataContractSerializer(DataContractAttribute + DataMemberAttribute)

var ser = new DataContractSerializer(typeof (StaticClass.SomeType)); 
var obj = new StaticClass.SomeType {Int = 2}; 
ser.WriteObject(stream, obj); 

... 

static class StaticClass 
{ 
    [DataContract] 
    public class SomeType 
    { 
     [DataMember] 
     public int Int { get; set; } 
    } 
} 

正如你所看到的DataContractSerializer甚至不需要StaticClass是公開的。一個區別是,你應該使用WriteObject' and的readObject」來代替SerializeDeserialize