2009-11-17 108 views
23

我想做一個對象的二進制序列化和結果將其保存在數據庫中。C#對象二進制序列化

Person person = new Person(); 
person.Name = "something"; 

MemoryStream memorystream = new MemoryStream(); 
BinaryFormatter bf = new BinaryFormatter(); 
bf.Serialize(memorystream, person); 

我怎樣才能變換一個字符串類型被保存在數據庫中的MemoryStream,並在此之後才能夠反序列化對象?

回答

48

你是什麼真的要求是一種安全的方式來表示任意二進制數據作爲文本,然後再次將其轉換回來。它存儲序列化對象的事實是無關緊要的。

答案几乎使用基本64(例如Convert.ToBase64StringConvert.FromBase64String)。難道使用Encoding.UTF8.GetString或任何類似 - 您的二進制數據編碼的文本數據,並且不應該被如此對待。

但是,您的數據庫沒有二進制數據的數據類型?數據檢查BLOB,圖像和2值類型...

+0

字節串---需要一定的編碼。 – loneshark99 2017-05-04 06:26:21

+0

@ loneshark99:我完全不理解你的評論。如果這是任意的二進制數據 - 而不是編碼文本 - 那麼使用'Encoding'就是錯誤的方法。 – 2017-05-04 06:33:34

+0

我正在學習,但我想知道爲什麼Encoding不是正確的方法和ToBase64String是。 – loneshark99 2017-05-04 06:37:26

8

我用這樣的

MemoryStream memoryStream = new MemoryStream(); 
BinaryFormatter binaryFormatter = new BinaryFormatter(); 
binaryFormatter.Serialize(memoryStream, Person); 
memoryStream.Flush(); 
memoryStream.Position = 0; 
string value = Convert.ToBase64String(memoryStream.ToArray()); 
+8

在調用ToArray之前,不需要倒回一個MemoryStream - 無論當前位置如何,它都會返回整個流的數據。同樣Flush也不會對MemoryStream執行任何操作,儘管對於一般的流來說它是個好主意。 – 2009-11-17 13:59:47

+0

Thanx的建議。 – 2009-11-17 14:00:38

2

基本上保存爲字符串到數據庫中,有可用於存儲blob領域二進制數據。

如果你真的需要有數據爲字符串,你需要將你的byte []轉換成字符串使用base64編碼,並從字符串中使用解碼搶的byte []。

0

你有沒有研究將MemoryStream轉換成base64hex字符串被放入數據庫?

byte[] mStream = memorystream.ToArray(); 
string sConvertdHex = System.Convert.ToBase64String(mStream) 

然後,您可以將內容sConvertdHex轉儲到數據庫。要反序列化它,您需要執行反向操作

byte[] mData = System.Convert.FromBase64String(...) 

然後將mData反序列化回您的對象。

32

下面是示例。 TData必須標記[可序列化],並且所有字段類型也是。

private static TData DeserializeFromString<TData>(string settings) 
    { 
     byte[] b = Convert.FromBase64String(settings); 
     using (var stream = new MemoryStream(b)) 
     { 
      var formatter = new BinaryFormatter(); 
      stream.Seek(0, SeekOrigin.Begin); 
      return (TData)formatter.Deserialize(stream); 
     } 
    } 

    private static string SerializeToString<TData>(TData settings) 
    { 
     using (var stream = new MemoryStream()) 
     { 
      var formatter = new BinaryFormatter(); 
      formatter.Serialize(stream, settings); 
      stream.Flush(); 
      stream.Position = 0; 
      return Convert.ToBase64String(stream.ToArray()); 
     } 
    } 
16
 //-------write to database------------------------- 
     Person person = new Person(); 
     person.name = "Firstnm Lastnm"; 
     MemoryStream memorystream = new MemoryStream(); 
     BinaryFormatter bf = new BinaryFormatter(); 
     bf.Serialize(memorystream, person); 
     byte[] yourBytesToDb = memorystream.ToArray(); 
     //here you write yourBytesToDb to database 


     //----------read from database--------------------- 
     //here you read from database binary data into yourBytesFromDb 
     MemoryStream memorystreamd = new MemoryStream(yourBytesFromDb); 
     BinaryFormatter bfd = new BinaryFormatter(); 
     Person deserializedperson = bfd.Deserialize(memorystreamd) as Person; 
+1

'MemoryStream'周圍應該有一個'使用' – j00hi 2016-08-01 19:49:37