1

当我尝试将对象转换为字节数组时,我得到了一个奇怪的数组。这是代码:

        using (MemoryStream ms = new MemoryStream())
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, obj);
            Console.WriteLine(ByteArrayToString(ms.ToArray()));
        }
//int obj = 50;

//string ByteArrayToString(byte[] byteArr) the functionality of this method is pretty obvious

结果是这样的:

"00 01 00 00 00 FF FF FF FF 01 00 00 00 00 00 00 00 04 01 00 00 00 0C 53 79 73 74 65 6D 2E 49 6E 74 33 32 01 00 00 00 07 6D 5F 6560C 07 6D 5F 6560C 06 32 00 00 00 0B "

有人可以向我解释为什么吗?:) 最佳结果应该只有“32 00 00 00”。

4

5 回答 5

8

由于序列化程序需要提供足够的信息来反序列化数据,它必须包含一些关于被序列化对象的元数据。具体来说,

53 79 73 74 65 6D 2E 49 6E 74 33 32

部分代表System.Int32

如果您改用BinaryWriterand 它的Write(Int32)方法,您将获得所需的效果:您的内存流将仅包含整数中的四个字节。Int32如果不知道您将 an写入流中,您将无法反序列化它。

于 2012-05-07T16:41:02.320 回答
2

您将BinaryFormatter序列化与对象的内存格式混为一谈。写入流的内容仅仅是 的实现细节,BinaryFormatter不应依赖于任何不使用BinaryFormatter.

如果您正在寻找内置类型的字节表示,请使用BitConverter.GetBytes(对于字符串,请使用适当的Encoding.GetBytes)。

于 2012-05-07T16:41:05.403 回答
1

序列化的字节数组既有数据本身也有类型信息。这就是为什么您获得的信息比您预期的要多。这是以后反序列化所必需的。

于 2012-05-07T16:49:16.757 回答
0

序列化过程使用额外的字节来存储有关类型的信息 - 这是确保序列化数据将被反序列化为相同类型的相同对象的唯一方法。如果您绝对确定自己在做什么并希望避免任何额外的字节,您可以使用自己的序列化并制作您的格式化程序和序列化程序,这非常复杂。或者,您可以使用编组:

var size = Marshal.SizeOf(your_object);
// Both managed and unmanaged buffers required.
var bytes = new byte[size];
var ptr = Marshal.AllocHGlobal(size);
// Copy object byte-to-byte to unmanaged memory.
Marshal.StructureToPtr(font.LogFont, ptr, false);
// Copy data from unmanaged memory to managed buffer.
Marshal.Copy(ptr, bytes, 0, size);
// Release unmanaged memory.
Marshal.FreeHGlobal(ptr);

并将字节转换为对象:

var bytes = new byte[size];
var ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(bytes, 0, ptr, size);
var your_object = (YourType)Marshal.PtrToStructure(ptr, typeof(YourType));
Marshal.FreeHGlobal(ptr);

这在大多数情况下使用起来非常缓慢且不安全,但这是在不实现序列化和没有 [Serializable] 属性的情况下将对象严格转换为 byte[] 的最简单方法。

于 2013-10-19T16:08:32.193 回答
0

结果中的额外内容将是 BinaryFormatter 对象。您不仅输出 int obj = 50,还输出 BinaryFormatter 中包含的所有内容。

于 2012-05-07T16:39:10.267 回答