2011-08-31 28 views
3

我正在創建一個非常基本的聊天應用程序。我使用tcp連接建立聊天。我經常通過網絡流發送序列化的對象,因爲這樣編程更簡單。無論如何,如果我有一個class person{ public string name{get;set;} }那麼它將是eassy序列化該類。當我包含public ImageSource Img {get;set;}時,我無法再將該類人員序列化。序列化System.Windows.Media.ImageSource對象

序列化的方式是:

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 
+0

圖像到xml序列化是位....奇怪 –

+0

我不介意使用不同類型的序列化... –

回答

5

您無法將圖像序列化爲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。

+0

和一旦我有圖像作爲字符串如何將它轉換回圖像? –

+0

@Tono Nam,請參閱我的更新回答 –

+0

「Base64ToImage」方法似乎存在問題 - 在「BitmapFrame」實際訪問它之前,流被放置。我已經在[這個答案]中描述了修復(http://stackoverflow.com/a/13424285/197913)。 –

1

你的做法是正確的,但已經不盡快類Person工作包含像你的情況ImageSource的任何非序列化的對象。

如果我必須解決它靠近您的解決方案,我會存儲圖像的byte[],並在反序列化之後解析它以重建ImageSource。