2010-12-18 13 views
11

quiero serializar una clase bastante normal, pero el problema es que es anidado en una clase estática como esto:Cómo serializar clase hija no estático de la clase estática

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

este código:

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

Produce este error:

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

Ese error parece completamente irrelevante; StaticClass.SomeType no es un tipo estático.

¿Hay alguna forma de evitar esto? ¿Me equivoco al pensar que este error es tonto?

+6

por cierto, '[Serializable]' no añade nada aquí - 'XmlSerializer' no lo usa. –

+0

parece un error ... –

+2

Ya se informó en Connect: https://connect.microsoft.com/VisualStudio/feedback/details/523204/class-that-isnested-in-static-class-cannot -be-xml-serialized –

Respuesta

8

Como solución pragmática - no marque el tipo de anidación static:

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

    public class SomeType 
    { 
     ... 
    } 
} 
+0

como una solución a la limitación de XmlSerializer, esta es la más práctica para mí. gracias :) – tenfour

+1

+1 simple y eficaz. Si fuera a hacer esto, también marqué la clase como sellada. Me recuerda a los antiguos .NET 1 días (clase sellada y constructor privado) – RichardOD

4

Se sabe limitation in XmlSerializer()

Y solución es utilizar 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; } 
    } 
} 

Como se puede ver DataContractSerializer ni siquiera requiere StaticClass a ser pública. Una diferencia es que se debe utilizar WriteObject' and ReadObject' en lugar Serialize y Deserialize

Cuestiones relacionadas