2011-02-24 69 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的数组。

相关问题