use*_*973 3 c# wpf serialization image observablecollection
有一点问题.我有一个程序,可以构建一个可观察的用户集合.用户有名字,姓氏和图像.我可以将用户添加到observable集合中,但我也想保存集合并在每次重新打开程序时加载它.
我的问题是,虽然保存名字和姓氏相当容易,但编写者无法将图像写入xml文件.有没有办法解决?
这是我到目前为止所拥有的:
可观察的集合:
ObservableCollection<VendorClass> ProfileList = new ObservableCollection<VendorClass>();
Run Code Online (Sandbox Code Playgroud)
有问题的作家:
XmlSerializer xs = new XmlSerializer(typeof(ObservableCollection<VendorClass>));
using (StreamWriter wr = new StreamWriter("vendors.xml")) //Data/customers.xml
{
xs.Serialize(wr, ProfileList);
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?如果确实存在写入图像的解决方案,是否有可行的方法再次读出它?
XmlSerializer无法序列化或反序列化WPF图像类型,如BitmapImage等.但它可以(反)序列化字节数组.因此,您可以byte[] ImageBuffer向Person类添加一个属性,该类包含二进制图像数据.然后,您还可以在XmlIgnore属性上设置Image属性以禁止其(反)序列化,并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];
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这个答案中,也为Bitmap类型的属性建议了这种方法.
| 归档时间: |
|
| 查看次数: |
12746 次 |
| 最近记录: |