5

少し問題が発生しました。ユーザーの監視可能なコレクションを構築するプログラムがあります。ユーザーには、名、姓、および画像があります。ユーザーを監視可能なコレクションに追加できますが、コレクションを保存して、プログラムを再度開くたびにロードしたいと考えています。

私の問題は、名前と姓を保存するのはかなり簡単ですが、ライターは画像を xml ファイルに書き込めないことです。これを回避する方法はありますか?

これが私がこれまでに持っているものです:

観察可能なコレクション:

ObservableCollection<VendorClass> ProfileList = new ObservableCollection<VendorClass>();

問題のあるライター:

XmlSerializer xs = new XmlSerializer(typeof(ObservableCollection<VendorClass>));
        using (StreamWriter wr = new StreamWriter("vendors.xml")) //Data/customers.xml
        {
            xs.Serialize(wr, ProfileList);
        }

何か案は?そして、画像に書き込む解決策が存在する場合、それを再度読み取る実行可能な方法はありますか?

4

2 に答える 2

9

XmlSerializer は、BitmapImage などの WPF イメージ タイプをシリアル化または逆シリアル化できません。ただし、バイト配列を (逆) シリアル化することはできます。byte[] ImageBufferそのため、バイナリ イメージ データを含むプロパティを Person クラスに追加できます。次に、プロパティのXmlIgnore属性を設定しImageてその (逆) シリアル化を抑制しXmlElement("Image")ImageBufferプロパティで (逆) シリアル化を として設定し<Image>...</Image>ます。

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [XmlIgnore]
    public BitmapSource Image { get; set; }

    [XmlElement("Image")]
    public byte[] ImageBuffer
    {
        get
        {
            byte[] imageBuffer = null;

            if (Image != null)
            {
                using (var stream = new MemoryStream())
                {
                    var encoder = new PngBitmapEncoder(); // or some other encoder
                    encoder.Frames.Add(BitmapFrame.Create(Image));
                    encoder.Save(stream);
                    imageBuffer = stream.ToArray();
                }
            }

            return imageBuffer;
        }
        set
        {
            if (value == null)
            {
                Image = null;
            }
            else
            {
                using (var stream = new MemoryStream(value))
                {
                    var decoder = BitmapDecoder.Create(stream,
                        BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
                    Image = decoder.Frames[0];
                }
            }
        }
    }
}

このアプローチは、この回答でビットマップ型のプロパティに対しても提案されています。

于 2013-09-17T08:22:41.733 に答える