Serializar un bitmap en C # /. NET a XML

Quiero XML-Serializar un tipo complejo (clase), que tiene una propiedad de tipo System.Drawing.Bitmap entre otros.

///  /// Gets or sets the large icon, a 32x32 pixel image representing this face. ///  /// The large icon. public Bitmap LargeIcon { get; set; } 

Ahora descubrí que la serialización del bitmap con el serializador XML predeterminado no funciona, porque no tiene un constructor público sin parámetros, que es obligatorio con el serializador xml predeterminado.

Estoy al tanto de lo siguiente:

  • Existe una solución, publicada aquí: http://www.dotnetspider.com/resources/4759-XML-Serialization-C-Part-II-Images.aspx . Sin embargo, como esto incluye agregar otra propiedad, esto me parece un poco complicado.
  • También hay un proyecto de serialización de XML profundo en sourceforge.

Preferiría no hacer referencia a otro proyecto ni ajustar mucho mi clase para permitir la serialización xml de esos mapas de bits.

¿No hay manera de mantener eso simple?

Muchas gracias, Marcel

Haría algo como:

 [XmlIgnore] public Bitmap LargeIcon { get; set; } [Browsable(false),EditorBrowsable(EditorBrowsableState.Never)] [XmlElement("LargeIcon")] public byte[] LargeIconSerialized { get { // serialize if (LargeIcon == null) return null; using (MemoryStream ms = new MemoryStream()) { LargeIcon.Save(ms, ImageFormat.Bmp); return ms.ToArray(); } } set { // deserialize if (value == null) { LargeIcon = null; } else { using (MemoryStream ms = new MemoryStream(value)) { LargeIcon = new Bitmap(ms); } } } } 

También puede implementar ISerializable y usar SerializationInfo para tratar manualmente su contenido de mapas de bits.

EDITAR: João tiene razón: la forma correcta de tratar la serialización XML es implementar IXmlSerializable , no ISerializable :

 public class MyImage : IXmlSerializable { public string Name { get; set; } public Bitmap Image { get; set; } public System.Xml.Schema.XmlSchema GetSchema() { throw new NotImplementedException(); } public void ReadXml(System.Xml.XmlReader reader) { throw new NotImplementedException(); } public void WriteXml(System.Xml.XmlWriter writer) { writer.WriteStartElement("Name"); writer.WriteString(this.Name); writer.WriteEndElement(); using(MemoryStream ms = new MemoryStream()) { this.Image.Save(ms, ImageFormat.Bmp ); byte[] bitmapData = ms.ToArray(); writer.WriteStartElement("Image"); writer.WriteBase64(bitmapData, 0, bitmapData.Length); writer.WriteEndElement(); } } } 

La clase BitMap no se ha diseñado para que sea XML Serialized. Entonces, no, no hay una forma simple de corregir una decisión de diseño.

Implemente IXmlSerializable y luego maneje todos los detalles de serialización usted mismo.

Como dices que es un tipo grande y solo tienes un problema con el bitmap, considera hacer algo como esto:

 public class BitmapContainer : IXmlSerializable { public BitmapContainer() { } public Bitmap Data { get; set; } public XmlSchema GetSchema() { throw new NotImplementedException(); } public void ReadXml(XmlReader reader) { throw new NotImplementedException(); } public void WriteXml(XmlWriter writer) { throw new NotImplementedException(); } } public class TypeWithBitmap { public BitmapContainer MyImage { get; set; } public string Name { get; set; } }