将C#/ .NET中的位图序列化为XML

Mar*_*cel 17 c# bitmap xml-serialization

我想XML-Serialize一个复杂类型(类),它具有System.Drawing.Bitmap类型属性.

    /// <summary>
    /// Gets or sets the large icon, a 32x32 pixel image representing this face.
    /// </summary>
    /// <value>The large icon.</value>
    public Bitmap LargeIcon { get; set; }
Run Code Online (Sandbox Code Playgroud)

我现在发现使用默认的XML序列化程序序列化Bitmap不起作用,因为它没有公共无参数构造函数,这对于默认的xml序列化程序是必需的.

我知道以下内容:

我宁愿不想引用另一个项目,也不想广泛调整我的类,只允许这些位图的xml序列化.

有没有办法保持这么简单?

非常感谢,马塞尔

Mar*_*ell 42

我会做的事情如下:

[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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 坦率地说,它是`XmlSerializer`唯一明智的选择.实现`IXmlSerializable`要求痛苦. (4认同)

Rub*_*ias 5

您还可以实现ISerializable并使用SerializationInfo手动处理位图内容.

编辑: João是对的:处理XML序列化的正确方法是实现IXmlSerializable,而不是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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)