带MemoryStream问题的BinaryFormatter

6 c# memorystream binaryformatter

我正在测试BinaryFormatter,看看它对我有用,我有一个简单的问题:

当它与字符串HELLO一起使用时,我将MemoryStream转换为数组,它给出了29个维度,其中五个是维度末尾的实际数据:

            BinaryFormatter bf = new BinaryFormatter();

            MemoryStream ms = new MemoryStream();

            byte[] bytes;
            string originalData = "HELLO";

            bf.Serialize(ms, originalData);
            ms.Seek(0, 0);

            bytes = ms.ToArray();
Run Code Online (Sandbox Code Playgroud)

回报

-       bytes   {Dimensions:[29]}   byte[]
        [0] 0   byte
        [1] 1   byte
        [2] 0   byte
        [3] 0   byte
        [4] 0   byte
        [5] 255 byte
        [6] 255 byte
        [7] 255 byte
        [8] 255 byte
        [9] 1   byte
        [10]    0   byte
        [11]    0   byte
        [12]    0   byte
        [13]    0   byte
        [14]    0   byte
        [15]    0   byte
        [16]    0   byte
        [17]    6   byte
        [18]    1   byte
        [19]    0   byte
        [20]    0   byte
        [21]    0   byte
        [22]    5   byte
        [23]    72  byte
        [24]    69  byte
        [25]    76  byte
        [26]    76  byte
        [27]    79  byte
        [28]    11  byte
Run Code Online (Sandbox Code Playgroud)

有没有办法只返回编码为字节的数据而没有所有无关的信息?

Tob*_*oby 6

所有这些无关的信息告诉另一个BinaryFormatter(将反序列化对象)正在反序列化的对象类型(在本例中System.String).根据类型,它包括重建对象所需的其他信息(例如,如果它是a StringBuilder,Capacity那么也将在那里编码.

如果您只想将字符串填充到MemoryStream缓冲区中:

        using (MemoryStream ms = new MemoryStream())
        using (TextWriter writer = new StreamWriter(ms))
        {
            writer.Write("HELLO");
            writer.Flush();

            byte[] bytes = ms.ToArray();
        }
Run Code Online (Sandbox Code Playgroud)

  • 注意:`StreamWriter`构造函数在内部创建一个`UTF8Encoding`实例来实际转换为字节.如果您需要的是一个对应于字符串的字节数组,那么`MemoryStream`和`TextWriter`实际上并不是解决方案 - 它们只是隐式创建提供解决方案的类的巧合方式.只需直接使用`Encoding.UTF8.GetBytes` - 或者使用正确的编码类进行所需的字符编码(UTF-8是一个很好的默认选择). (2认同)