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

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

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

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

可观察的集合:

ObservableCollection ProfileList = new ObservableCollection(); 

有问题的作家:

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

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

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

 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类型的属性建议了这种方法。

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