为什么简单类型的序列化如此复杂?

时间:2011-02-24 10:46:08

标签: c# serialization

运行下一个代码时:

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...

这很明显,因为编译器无法明确地将对象转换为其他内容...

我做错了什么?

2 个答案:

答案 0 :(得分:4)

你没有得到一个4字节的数组,因为它必须序列化关于类型的所有信息,版本控制等。你说你想序列化各种不同的类型 - 你如何区分一个{{1如果您在数据中的任何位置都不包含任何类型信息,并且希望能够在不指定类型的情况下序列化/反序列化,那么和两个int值会一起使用?

如果您只想直接编写基元,请使用BinaryWriterBinaryReader

如果您想要更紧凑(和可移植)的二进制序列化协议,您可以考虑使用协议缓冲区(或其他各种序列化选项)。

答案 1 :(得分:1)

考虑使用专门用于基本类型的LosFormatterObjectStateFormatter。使用您的示例将生成一个大小为8和4的数组