c# - net - Serializar datos de miembros privados
serialize list to xml c# (4)
Los campos de solo lectura no se serializarán con XmlSerializer
, esto se debe a la naturaleza de la palabra clave readonly
Desde MSDN:
La palabra clave readonly es un modificador que puede usar en los campos. Cuando una declaración de campo incluye un modificador de solo lectura, las asignaciones a los campos introducidos por la declaración solo pueden ocurrir como parte de la declaración o en un constructor en la misma clase.
Entonces ... necesitaría establecer el valor de los campos en el constructor predeterminado ...
Estoy tratando de serializar un objeto a XML que tiene varias propiedades, algunas de las cuales son de solo lectura.
public Guid Id { get; private set; }
Marqué la clase [Serializable] y he implementado la interfaz ISerializable.
Debajo está el código que estoy usando para serializar mi objeto.
public void SaveMyObject(MyObject obj)
{
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
TextWriter tw = new StreamWriter(_location);
serializer.Serialize(tw, obj);
tw.Close();
}
Desafortunadamente, se cae en la primera línea con este mensaje.
InvalidOperationException no se ha manejado: no se ha podido generar una clase temporal (resultado = 1). error CS0200: no se puede asignar a la propiedad o indizador ''MyObject.Id'' - es de solo lectura
Si configuro la propiedad Id en público, funciona bien. ¿Puede alguien decirme si estoy haciendo algo, o al menos si es posible?
No es posible con ese modo particular de serialización (vea los otros comentarios para las soluciones). Si realmente desea abandonar su modo de serialización tal como está, debe evitar las limitaciones del marco en este caso. Mira este example
Esencialmente, marque la propiedad public
, pero arroje una excepción si se accede en cualquier momento que no sea la deserialización.
Puede usar DataContractSerializer
(pero tenga en cuenta que no puede usar atributos xml, solo elementos xml):
using System;
using System.Runtime.Serialization;
using System.Xml;
[DataContract]
class MyObject {
public MyObject(Guid id) { this.id = id; }
[DataMember(Name="Id")]
private Guid id;
public Guid Id { get {return id;}}
}
static class Program {
static void Main() {
var ser = new DataContractSerializer(typeof(MyObject));
var obj = new MyObject(Guid.NewGuid());
using(XmlWriter xw = XmlWriter.Create(Console.Out)) {
ser.WriteObject(xw, obj);
}
}
}
Alternativamente, puede implementar IXmlSerializable
y hacer todo usted mismo, pero esto funciona con XmlSerializer
, al menos.
Puede usar System.Runtime.Serialization.NetDataContractSerializer
. Es más potente y soluciona algunos problemas del clásico Serializador Xml.
Tenga en cuenta que hay diferentes atributos para este.
[DataContract]
public class X
{
[DataMember]
public Guid Id { get; private set; }
}
NetDataContractSerializer serializer = new NetDataContractSerializer();
TextWriter tw = new StreamWriter(_location);
serializer.Serialize(tw, obj);
Editar:
Actualización basada en el comentario de Marc: Probablemente deberías usar System.Runtime.Serialization.DataContractSerializer
para tu caso para obtener un XML limpio. El resto del código es el mismo.