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

我正在创建一个非常基本的聊天应用程序 我用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 

您无法将图像序列化为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在空间方面效率不高……如果可能的话,以二进制forms而不是XML格式传输图像会更好。

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

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

您可以使用BinaryFormatter或可用的编码器,如System.Windows.Media.Imaging命名空间中的 http://sofzh.miximages.com/c%23/system.windows.media.imaging.jpegbitmapencoder.aspx 。 另请参阅WPF BitmapImage序列化/反序列化 。 如果你想使用字符串(xml),那么我认为Base64是唯一的方法。