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 不能序列化或反序列化 WPF 图像类型,如 BitmapImage 等。但是它能够(反)序列化字节数组。因此,您可以向您的 Person 类添加一个byte[] ImageBuffer属性,其中包含二进制图像数据。然后,您还将在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];
                }
            }
        }
    }
}

此答案中的 Bitmap 类型的属性也建议使用此方法。

于 2013-09-17T08:22:41.733 回答
2

您将对图像进行 base64 编码以将其转换为字符串,然后将其写入 CDATA 部分。请参阅如何使用 XmlSerializer 将字符串序列化为 CDATA?

于 2013-09-17T05:14:35.953 回答