Cómo serializar la clase secundaria no estática de la clase estática

Quiero serializar una clase bastante común, pero el problema es que está nested en una clase estática como esta:

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

Este codigo

 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?

Como una 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 { ... } } 

Es una limitación conocida en XmlSerializer ()

Y la solución es usar 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 puede ver, DataContractSerializer ni siquiera requiere que StaticClass sea ​​pública. Una diferencia es que debe usar WriteObject' and ReadObject’ en lugar de Serialize y Deserialize

Haga que la clase no esté anidada o considere usar el DataContractSerializer en su lugar.