在XML文件中序列化和存储图像

use*_*973 3 c# wpf serialization image observablecollection

有一点问题.我有一个程序,可以构建一个可观察的用户集合.用户有名字,姓氏和图像.我可以将用户添加到observable集合中,但我也想保存集合并在每次重新打开程序时加载它.

我的问题是,虽然保存名字和姓氏相当容易,但编写者无法将图像写入xml文件.有没有办法解决?

这是我到目前为止所拥有的:

可观察的集合:

ObservableCollection<VendorClass> ProfileList = new ObservableCollection<VendorClass>();
Run Code Online (Sandbox Code Playgroud)

有问题的作家:

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

有任何想法吗?如果确实存在写入图像的解决方案,是否有可行的方法再次读出它?

Cle*_*ens 6

XmlSerializer无法序列化或反序列化WPF图像类型,如BitmapImage等.但它可以(反)序列化字节数组.因此,您可以byte[] ImageBuffer向Person类添加一个属性,该类包含二进制图像数据.然后,您还可以在XmlIgnore属性上设置Image属性以禁止其(反)序列化,并XmlElement("Image")ImageBuffer属性上设置为(de)将其序列化为<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];
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个答案中,也为Bitmap类型的属性建议了这种方法.