代码之家  ›  专栏  ›  技术社区  ›  user2453973

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

  •  5
  • user2453973  · 技术社区  · 11 年前

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

    我的问题是,虽然保存名字和姓氏相当容易,但作者无法将图像写入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);
            }
    

    有什么想法吗?如果确实存在在图像中写入的解决方案,有没有可行的方法可以再次读取?

    2 回复  |  直到 11 年前
        1
  •  10
  •   Community Dai    7 年前

    XmlSerializer无法序列化或反序列化WPF映像类型,如BitmapImage等。但是它可以(反)序列化字节数组。所以你可以添加一个 byte[] ImageBuffer 属性添加到Person类,该类包含二进制图像数据。然后,您还可以设置 XmlIgnore 上的属性 Image 属性以取消其(反)序列化,并设置 XmlElement("Image") ImageBuffer 将其(反)序列化为的财产 <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];
                    }
                }
            }
        }
    }
    

    对于中Bitmap类型的财产,也建议使用此方法 this answer .

        2
  •  2
  •   Community Dai    7 年前

    您需要对图像进行base64编码,将其转换为字符串,然后将其写入CDATA部分。看见 How do you serialize a string as CDATA using XmlSerializer?