2010-10-21 51 views
1

serialzed我有一個用下面的代碼序列化byte[]去serialze一個byte [],將其與XmlSerializer的

// Save an object out to the disk 
public static void SerializeObject<T>(this T toSerialize, String filename) 
{ 
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType()); 
    TextWriter textWriter = new StreamWriter(filename); 

    xmlSerializer.Serialize(textWriter, toSerialize); 
    textWriter.Close(); 
} 

問題是序列化看起來像這樣的數據:

iVBORw0KGgoAAAANSUhEUgAAAPAAAAFACAIAAAANimYEAAAAAXNSR0IArs4c6QAAAARnQU1BAACx...... 

當它被存儲在我的數據庫中時,它看起來像這樣:

0x89504E470D0A1A0A0000000D49484452000000F00000014008020000000D8A660400000001...... 

什麼是差異e,以及如何從磁盤獲取數據回byte[]


注意:數據是格式化爲這樣的PNG一個Bitmap

public byte[] ImageAsBytes 
{ 
    get 
    { 
     if (_image != null) 
     { 
      MemoryStream stream = new MemoryStream(); 
      _image .Save(stream, ImageFormat.Png); 
      return stream.ToArray(); 
     } 
     else 
     { 
      return null; 
     } 
    } 
    set 
    { 

     MemoryStream stream = new MemoryStream(value); 
     _image = new Bitmap(stream); 
    } 
} 

回答

3
iVBORw0KGgoAAAANSUhEUgAAAPAAAAFACAIAAAANimYEAAAAA... 

是二進制數據的base64編碼表示。

0x89504E470D0A1A0A0000000D49484452000000F000000140080... 

是十六進制。

獲取數據從磁盤恢復使用的XmlSerializer和反序列化回原來的對象:

public static T DeserializeObject<T>(string filename) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    using (var reader = XmlReader.Create(filename)) 
    { 
     return (T)serializer.Deserialize(reader); 
    } 
} 

但是如果你只擁有的base64字符串表示你可以使用FromBase64String方法:

byte[] buffer = Convert.FromBase64String("iVBORw0KGgoAAANimYEAAAAA..."); 

備註:確保您始終處理一次性資源,如流和文本閱讀器和編寫器。在您的SerializeObject<T>方法以及ImageAsBytes屬性的獲取和設置程序中,似乎不是這種情況。

+0

你先生,太棒了!至於一次性用品,我會就此提出另一個問題,因爲我從來沒有真正理解它。 – Vaccano 2010-10-21 18:32:59

+0

(在這裏問:http://stackoverflow.com/questions/3990775/when-to-dispose-and-why) – Vaccano 2010-10-21 18:41:39

相關問題