有点问题。我有一个程序,可以构建一个可观察的用户集合。用户有名字,姓氏和图像。我可以将用户添加到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);
}
有什么想法吗?如果确实存在写入图像的解决方案,是否有可行的方法再次读出它?
答案 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?