2010-12-18 13 views
11

Chcę serializacji całkiem zwyczajne klasy, ale połów jest to zagnieżdżone w klasie statycznej tak:Jak serializacji non-statyczną klasę dzieci klasy statycznej

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

ten kod:

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

Generuje ten błąd:

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

błąd wydaje się całkowicie nieistotne; StaticClass.SomeType nie jest typem statycznym.

Czy istnieje sposób obejścia tego? Czy nie mam racji, sądząc, że ten błąd jest głupi?

+6

btw,' [Serializable] 'nie dodaje niczego tutaj - 'XmlSerializer' go nie używa. –

+0

wygląda jak błąd ... –

+2

To zostało już zgłoszone na stronie Connect: https://connect.microsoft.com/VisualStudio/feedback/details/523204/class-that-is-nested-in-static-class-cannot -be-xml-serialized –

Odpowiedz

8

jako pragmatyczny obejście - nie oznaczają gniazdowania typ static:

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

    public class SomeType 
    { 
     ... 
    } 
} 
+0

jako obejście ograniczenia XmlSerializer, jest to najbardziej praktyczne dla mnie. dzięki :) – tenfour

+1

+1 proste i skuteczne. Jeśli miałbym to zrobić, zaznaczę też klasę jako zapieczętowaną. Przypomina mi stare .NET 1 dni (zamknięta klasa i prywatny konstruktor) – RichardOD

4

To wiem limitation in XmlSerializer()

I to jest uzycie 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; } 
    } 
} 

Jak widać DataContractSerializer nie wymaga nawet StaticClass być publiczne. Jedną z różnic jest to, że należy użyć WriteObject' and readObject”zamiast Serialize i Deserialize

Powiązane problemy