序列化System.Windows.Media.ImageSource对象

时间:2011-08-31 19:03:45

标签: c# serialization xml-serialization

我正在创建一个非常基本的聊天应用程序。我用tcp连接建立聊天。我经常通过网络流发送序列化对象,因为这样编程更简单。无论如何,如果我有一个class person{ public string name{get;set;} },那么它将是eassy序列化该类。当我加入public ImageSource Img {get;set;}时,我无法再将该班级序列化。

我序列化的方式是:

Person p = new Person();
p.name = \\some name
p.Img = \\ some image

System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType());

x.Serialize(connection.stream, p);//here is when the problem comes. I am not able to serialize it if I include an Img

3 个答案:

答案 0 :(得分:6)

您无法将图像序列化为XML,但可以将其保存为MemoryStream并将二进制数据编码为base64。

string ImageToBase64(BitmapSource bitmap)
{
    var encoder = new PngBitmapEncoder();
    var frame = BitmapFrame.Create(bitmap);
    encoder.Frames.Add(frame);
    using(var stream = new MemoryStream())
    {
        encoder.Save(stream);
        return Convert.ToBase64String(stream.ToArray());
    }
}

BitmapSource Base64ToImage(string base64)
{
    byte[] bytes = Convert.FromBase64String(base64);
    using(var stream = new MemoryStream(bytes))
    {
        return BitmapFrame.Create(stream);
    }
}

请注意,base64在空间方面效率不高......如果可能,最好以二进制形式而不是XML格式传输图像。

答案 1 :(得分:1)

您的方法是正确的,但只要类Person包含任何非可序列化对象(例如您的ImageSource),就不再有效。

如果我必须解决它并接近你的解决方案,我会存储图像的byte[]并在反序列化后解析它以重建ImageSource。

答案 2 :(得分:1)

您可以使用二进制格式或http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.jpegbitmapencoder.aspx中的System.Windows.Media.Imaging Namespace等可用编码器。另请参阅WPF BitmapImage Serialization/Deserialization。如果你想使用string(xml),那么我认为Base64是唯一的方法。