C# 序列化图像并将其存储在XML文件中
有点小问题。我有一个程序,可以建立一个可观察的用户集合。用户有名字、姓氏和图像。我可以将用户添加到可观察的集合中,但我也希望保存集合,并在每次重新打开程序时加载它 我的问题是,虽然保存firstname和lastname相当容易,但编写器无法将图像写入xml文件。这有什么办法吗 以下是我目前掌握的情况: 可观测集合:C# 序列化图像并将其存储在XML文件中,c#,wpf,image,serialization,observablecollection,C#,Wpf,Image,Serialization,Observablecollection,有点小问题。我有一个程序,可以建立一个可观察的用户集合。用户有名字、姓氏和图像。我可以将用户添加到可观察的集合中,但我也希望保存集合,并在每次重新打开程序时加载它 我的问题是,虽然保存firstname和lastname相当容易,但编写器无法将图像写入xml文件。这有什么办法吗 以下是我目前掌握的情况: 可观测集合: ObservableCollection<VendorClass> ProfileList = new ObservableCollection<VendorCl
ObservableCollection<VendorClass> ProfileList = new ObservableCollection<VendorClass>();
ObservableCollection ProfileList=新的ObservableCollection();
问题作家:
XmlSerializer xs = new XmlSerializer(typeof(ObservableCollection<VendorClass>));
using (StreamWriter wr = new StreamWriter("vendors.xml")) //Data/customers.xml
{
xs.Serialize(wr, ProfileList);
}
XmlSerializer xs=新的XmlSerializer(typeof(observeCollection));
使用(StreamWriter wr=new StreamWriter(“vendors.xml”)//Data/customers.xml
{
序列化(wr,ProfileList);
}
有什么想法吗?如果确实存在写入图像的解决方案,是否有可行的方法再次读取图像?您可以对图像进行base64编码,将其转换为字符串,然后将其写入CDATA部分。请参阅XmlSerializer无法序列化或反序列化诸如BitmapImage等WPF映像类型。但是,它可以(反)序列化字节数组。因此,您可以向Person类添加一个
byte[]ImageBuffer
属性,该类包含二进制图像数据。然后还可以在Image
属性上设置XmlIgnore
属性以抑制其(反)序列化,并在ImageBuffer
属性上设置xmlement(“Image”)
以将其作为反序列化
对于.Yikes中位图类型的属性,也建议使用这种方法。这为我指明了正确的方向,但几乎没有,也没有任何地方能与图像相关。谢谢!我一直在想办法,你的答案是迄今为止最清楚最简单的。干得很好,不客气。另一种解决方案是让类用户实现IXmlSerializable
接口,如中所示。但是,您必须(反)序列化该实现中类的所有属性。
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];
}
}
}
}
}