2010-12-18 7 views
11

Je veux sérialiser une classe assez ordinaire, mais la prise est il est niché dans une classe statique comme ceci:Comment sérialiser classe enfant non statique de classe statique

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

Ce code:

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

Produit cette erreur:

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

cette erreur semble complètement hors de propos; StaticClass.SomeType n'est pas un type statique.

Y a-t-il un moyen de contourner cela? Ai-je tort de penser que cette erreur est stupide?

+6

BTW,' [Serializable] 'n'ajoute rien ici - 'XmlSerializer' ne l'utilise pas. –

+0

ressemble à un bug ... –

+2

Il a déjà été signalé sur Connect: https://connect.microsoft.com/VisualStudio/feedback/details/523204/class-that-is-nested-in-static-class-cannot -be-xml-serialized –

Répondre

8

Pour contourner ce problème pragmatique - ne marque pas le type de nidification static:

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

    public class SomeType 
    { 
     ... 
    } 
} 
+0

comme une solution de contournement à la limitation XmlSerializer, c'est le plus pratique pour moi. merci :) – tenfour

+1

+1 simple et efficace. Si je devais le faire, j'aurais aussi marqué la classe comme scellée. Me rappelle l'ancien .NET 1 jours (classe scellée et constructeur privé) – RichardOD

4

Il Connaissons limitation in XmlSerializer()

et solution consiste à utiliser 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; } 
    } 
} 

Comme vous pouvez le voir DataContractSerializer n'a même pas besoin d'être StaticClass public. Une différence est que vous devez utiliser WriteObject' and ReadObject » au lieu Serialize et Deserialize

Questions connexes