序列化后各种类型的变量的字节形式

时间:2018-04-29 16:18:52

标签: c# serialization

我使用下面显示的函数将不同类型的不同变量转换为字节数组。

public static byte[] ObjectToByteArray(Object obj)
    {
        BinaryFormatter bf = new BinaryFormatter();
        using (var ms = new MemoryStream())
        {
            bf.Serialize(ms, obj);
            return ms.ToArray();
        }
    }

    static void Main(string[] args)
    {
        various_types a = default(current_type);
        byte[] bytearray = ObjectToByteArray(a);
        Console.WriteLine(bytearray);
    }

对于字节a = 0;

0 1 0 0 0 255 255 255 255 1 0 0 0 0 0 0 0 4 1 0 0 0 11 83 121 115 116 101 109 46 66 121 116 101 1 0 0 0 7 109 95 118 97 108 117 101 0 2 0 11

字节a = 255;

0 1 0 0 0 255 255 255 255 1 0 0 0 0 0 0 0 4 1 0 0 0 11 83 121 115 116 101 109 46 66 121 116 101 1 0 0 0 7 109 95 118 97 108 117 101 0 2 255 11

不同之处仅在于最后一个字节旁边的字节 - 变量的值存储在那里。其余的是相同的。对所有其他类型也是如此;一组相同的字节(约50个似乎 - 49个相同的字节用于'字节'类型,50个用于' int'类型,51用于' ulong'类型),那么几个字节存储实际值,一个字节结束它(11是我检查的所有类型的结束字节)。

其他字节中包含哪些信息?

1 个答案:

答案 0 :(得分:1)

正如Hans Passant所说,数据与BinaryFormatter的内部工作方式有关,而不是变量本身。变量本身需要与其规范一样多。

  

您的十六进制转储中有很多与变量类型无关的内容。 BinaryFormatter添加文件头,并包含类型的类型声明和存储该值的字段。当您使用一个体面的十六进制查看器时,更明显的是,它还会显示字节值的ascii文本。否则一个字节有一个非常简单的表示,它只需要一个字节。