2011-02-24 91 views
1

運行下面的代碼時:爲什麼簡單類型的序列化如此複雜?

int myInt = 13; 
object myObj = myInt; 
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new  System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
     System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
     bf.Serialize(ms, myObj); 
     byte[] myByteArray = ms.ToArray(); 

你得到一個數組,其長度爲54個字節 - 我不明白你爲什麼不拿到4個字節長度的數組。

即使您嘗試序列化int變量(而不是對象變量),如下所示: bf.Serialize(ms,myInt);

你會得到同樣的結果。 我的目標是不同類型(的Int32,Int16類型等)轉換爲字節數組,所以我不能使用

BitConverter.GetBytes(myObj); 

,因爲它不會編譯:

Error 1 The best overloaded method match for 'System.BitConverter.GetBytes(bool)' has some invalid arguments... 

這是顯而易見的,因爲編譯器無法明確地告訴它,不能將對象轉換爲別的東西...

我在做什麼錯?

回答

4

你不會得到一個4字節的數組,因爲它需要序列化關於該類型的所有信息,版本控制等。你說你想序列化各種不同的類型 - 你如何區分一個int和兩個short值,如果你沒有在數據中的任何地方包含任何類型信息希望能夠序列化/反序列化而不指定類型?

如果你只是想直接寫原語,使用BinaryWriterBinaryReader

如果你想要一個更緊湊(和可移植)的二進制序列化協議,你可以考慮使用Protocol Buffers(或其他各種序列化選項)。

1

考慮使用LosFormatterObjectStateFormatter它們專用於原始類型。使用你的例子將產生一個大小爲8和4的數組。