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

C# 序列化后各种类型变量的字节形式,c#,serialization,C#,Serialization,我使用下面显示的函数将不同类型的不同变量转换为字节数组 public static byte[] ObjectToByteArray(Object obj) { BinaryFormatter bf = new BinaryFormatter(); using (var ms = new MemoryStream()) { bf.Serialize(ms, obj); return ms.To

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

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
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
对于字节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 0 11
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个相同的字节表示“byte”类型,50个相同的字节表示“int”类型,51个相同的字节表示“ulong”类型),然后是几个存储实际值的字节,最后是一个字节(11是我检查过的所有类型的结束字节)


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

正如Hans Passant所说,数据与BinaryFormatter的内部工作有关,而不是变量本身。变量本身的取值与其规范中的取值相同


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


十六进制转储中还有很多与变量类型无关的内容。BinaryFormatter添加一个文件头,包括类型的类型声明和存储值的字段。更明显的是,当您使用一个像样的十六进制查看器时,它也会显示字节值的ascii文本。一个字节有一个非常简单的表示,它只需要一个字节。@HansPassant谢谢。我在哪里可以收集这些知识(你从哪里知道的)?我在MSDN上看不到任何类似的东西,谷歌也没有透露,至少乍一看是这样。我对它进行了反向工程,首先想知道BinaryFormatter如何能够检测程序集版本和类更改,然后像您一样查看十六进制转储并阅读BinaryFormatter源代码。像这样的网站是避免花费这种时间的一种相当体面的方式。@JohnSmith看这里:。这是BinaryFormatter的规范