2010-12-18 7 views
11

Ich möchte eine ziemlich gewöhnliche Klasse serialisiert werden, aber der Haken ist es in einer statischen Klasse wie folgt verschachtelt ist:Wie nicht-statische Kind Klasse der statischen Klasse serialisiert

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

Dieser Code:

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

Erzeugt diesen Fehler:

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

dieser Fehler völlig irrelevant scheint; StaticClass.SomeType ist kein statischer Typ.

Gibt es einen Weg um dies? Bin ich falsch zu denken, dass dieser Fehler dumm ist?

+6

btw,' [Serializable] 'nichts hinzufügen hier - 'XmlSerializer' verwendet es nicht. –

+0

sieht aus wie ein Fehler ... –

+2

Es wurde bereits auf Connect: https://connect.microsoft.com/VisualStudio/feedback/details/523204/class-that-is-nested-in-static-class-cannot gemeldet -be-xml-serialisiert –

Antwort

8

Als pragmatische Abhilfe - kennzeichnen nicht die Verschachtelung Typ static:

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

    public class SomeType 
    { 
     ... 
    } 
} 
+0

als eine Umgehung der XmlSerializer-Einschränkung ist dies das praktischste für mich. Danke :) – tenfour

+1

+1 einfach und effektiv. Wenn ich das machen würde, hätte ich die Klasse auch als versiegelt markiert. Erinnert mich an die alten .NET 1 Tage (versiegelte Klasse und privater Konstruktor) – RichardOD

1

Entweder machen Sie die Klasse nicht verschachtelt oder erwägen stattdessen die Verwendung der .

4

Es wissen limitation in XmlSerializer()

Und Abhilfe ist DataContractSerializer (+ Datacontractdatamember)

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; } 
    } 
} 

Wie Sie DataContractSerializer nicht einmal StaticClass öffentlich sein bedarf es sehen können, zu verwenden. Ein Unterschied besteht darin, dass Sie WriteObject' and Liesobjekt verwenden sollten‘statt Serialize und Deserialize