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

时间:2013-09-17 05:10:13

标签: c# wpf image serialization observablecollection

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

我的问题是,虽然保存名字和姓氏相当容易,但作者无法将图像写入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);
        }

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

2 个答案:

答案 0 :(得分:6)

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

这种方法也被建议用于this answer中的Bitmap类型的属性。

答案 1 :(得分:1)

您将对图像进行base64编码,将其转换为字符串,然后将其写入CDATA部分。见How do you serialize a string as CDATA using XmlSerializer?