c# - una - no se permiten modificadores de acceso en constructores estáticos
C#serializar miembro privado de la clase (6)
class Person
{
public string m_name;
private int m_age; // << how do I serialize the darn little rat?
}
Pregunta simple todavía parece un gran lío al tratar de responderlo.
Todo el mundo sugiere usar getter / setter público, pero mi aplicación es demasiado grande y hacer un getter / setter para cada miembro solo causaría problemas de mantenimiento.
¿Estoy obligado a crear una serialización personalizada aquí o hay un atributo mágico para dichos miembros?
¿Cómo serializo los miembros privados de la clase?
Editar # 1 :
Ok todos, disculpe por la falta de claridad, estaba un poco molesto cuando escribí esta pregunta, fue varias horas después de intentar encontrar la solución.
De todos modos, aquí hay más hechos:
1. Estoy tratando de XML serializar esta clase. Actualmente estoy usando System.Xml.Serialization.XmlSerializer
.
2. Estoy serializando en XML para tener compatibilidad de versiones , que por lo que entiendo binario no me ofrece eso.
3. Tenía la esperanza de que haya un cierto atributo como :
class Person
{
public string m_name;
[SerializeThat(ElementName="Age")]
private int m_age; // << how do I serialize the darn little rat?
}
O (continúa del hecho # 3) un atributo que va en la clase que se vería así:
[Serializable(DoPrivate = true, DoProtected = true)]
class Person
{
public string m_name;
private int m_age; // << how do I serialize the darn little rat?
}
Ahora, ¿qué puedo hacer para lograrlo?
¿Qué serializador te comió usar actualmente? Casi todos deberían trabajar con eso. Pero los campos públicos * son * una mala idea. XmlSerializer y JavaScriptSerializer ignorarán los miembros privados. DataContractSerializer y protobuf-net pueden tratar con miembros privados. BinaryFormatter maneja campos (públicos o privados), pero no es una buena idea IMO por numerosas razones.
Mejor escribe serializador personalizado
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx
No sé si puede usar DataContract
. Pero con esto podrías escribir:
[DataContract]
class Person
{
[DataMember]
public string m_name;
[DataMember]
private int m_age;
}
La ventaja de DataContract es que puedes serializar campos privados y tu clase no necesita un constructor predeterminado.
Partiendo de la suposición de un error tipográfico, me gustaría redirigirlo a este artículo de SO en el que la solución es usar un DataContractSerializer
lugar.
Si usa BinaryFormatter
, irá a las partes privadas de su clase.
Marca todas las clases tuyas con [Serializable] o no llegarás lejos ...
Además, mira esto: ¿Por qué se requiere un atributo serializable para que un objeto sea serializado?
Ya que necesitas XML, tal vez puedas SoapFormatter
aunque todo con SoapFormatter
. Mira this
Compatibilidad con la versión Apropos: uso BinaryFormatter
y no tengo problemas con las actualizaciones de esquema. Pruébelo: puede manejar los cambios de esquema usted mismo, simplemente reemplaza los punteros nulos que deja el Deserialize
con las construcciones predeterminadas apropiadas. Si realmente no necesita las características que proporciona XML, vaya binario; nunca mirará hacia atrás.
Además, una EDITACIÓN más:
BF resolverá fácilmente todas sus múltiples referencias, por lo que no creará varias instancias de la misma referencia una y otra vez. Supongo que no obtendrá eso con XmlSerializer
; es obvio que no tiene lugar para almacenar esa información.
Ejemplo:
class Data
{
int a;
}
class ManyData
{
Data d1;
Data d2;
}
...
ManyData md=new ManyData();
md.d1=new Data();
md.d2=md.d1;
Intente serializar / deserializar md
con varias alternativas ...