0

重複の可能性:
C#/.NET のビットマップを XML にシリアル化する

XmlSerializer を使用して MyClass をシリアル化しようとしていますが、 [XmlInclude(typeof(Bitmap))] が機能しないようです。

using System;
using System.Drawing;
using System.IO;
using System.Xml.Serialization;

class Program {
    static void Main() {
        var myClass = new MyClass {
            Name = "foo",
            MyImage = new Bitmap(@"e:\pumpkin.jpg")
        };

        var serializer = new XmlSerializer(typeof(MyClass));
        var fileStream = File.OpenWrite(@"e:\test.xml");
        serializer.Serialize(fileStream, myClass);
    }
}

[Serializable]
[XmlInclude(typeof(Bitmap))]
public class MyClass {
    public string Name { get; set; }
    public Bitmap MyImage { get; set; }
}

結果のファイルは次のとおりです。

<?xml version="1.0"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>foo</Name>
  <MyImage>
    <Palette />
  </MyImage>
</MyClass>
4

1 に答える 1

1

ビットマップをバイト配列として取得/設定するプロパティを作成できます。これは、シリアライザーによってエンコードされた base-64 である必要があります。

public byte[] MyImageBytes {
    get {
       ImageConverter converter = new ImageConverter();
       return (byte[])converter.ConvertTo(MyImage, typeof(byte[]));
    }
}

[XmlIgnore] 属性を使用して Bitmap プロパティを非表示にすることもできます。また、LinqToXml の方がはるかに制御しやすいため、シリアライザーよりも優先することもできます。

base-64 エンコーディングの場合、XmlSerializer のパフォーマンスは非常に悪いことに注意してください。これは LinqToXml にも当てはまりますが、BitConverter クラスは base-64 への変換をうまく処理します。

于 2013-01-15T14:25:37.757 に答える