Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化图像并将其存储在XML文件中_C#_Wpf_Image_Serialization_Observablecollection - Fatal编程技术网

C# 序列化图像并将其存储在XML文件中

C# 序列化图像并将其存储在XML文件中,c#,wpf,image,serialization,observablecollection,C#,Wpf,Image,Serialization,Observablecollection,有点小问题。我有一个程序,可以建立一个可观察的用户集合。用户有名字、姓氏和图像。我可以将用户添加到可观察的集合中,但我也希望保存集合,并在每次重新打开程序时加载它 我的问题是,虽然保存firstname和lastname相当容易,但编写器无法将图像写入xml文件。这有什么办法吗 以下是我目前掌握的情况: 可观测集合: ObservableCollection<VendorClass> ProfileList = new ObservableCollection<VendorCl

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

我的问题是,虽然保存firstname和lastname相当容易,但编写器无法将图像写入xml文件。这有什么办法吗

以下是我目前掌握的情况:

可观测集合:

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];
                }
            }
        }
    }
}