c# - uso - Cómo serializar clase secundaria no estática de clase estática
static c# (3)
Como solución alternativa pragmática: no marque el tipo de anidamiento static
:
public class ContainerClass
{
private ContainerClass() { // hide the public ctor
throw new InvalidOperationException("no you don''t");
}
public class SomeType
{
...
}
}
Quiero serializar una clase bastante ordinaria, pero la trampa está anidada en una clase estática como esta:
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?
Haga la clase no anidada o considere usar DataContractSerializer en su lugar.
Se conoce la limitación 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úblico. Una diferencia es que debe usar WriteObject'' and
ReadObject'' en lugar de Serialize
y Deserialize