7

我正在测试 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();

返回

-       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

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

4

5 回答 5

6

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

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

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

            byte[] bytes = ms.ToArray();
        }
于 2010-06-01T20:53:24.663 回答
2

对于简单的字符串,请使用 BinaryWriter。开销将减少到一个小长度的前缀。

BinaryFormatter 旨在用于序列化(复杂)对象集群,并且需要一些辅助数据结构来做到这一点。

于 2010-06-01T20:47:09.597 回答
2

这取决于你真正想要什么。您可以使用 Encoding.UTF8.GetBytes 从字符串中获取 UTF8 字节数组。

于 2010-06-01T20:47:28.703 回答
2

您不应该剥离所有“无关”的信息。当您想从序列化数据重构对象时,反序列化器在另一端需要它。

于 2010-06-01T20:48:00.440 回答
2

您只是想将字符串转换为字节数组吗?如果这是您的目标,您可以执行以下操作:

byte[] bits = System.Text.Encoding.UTF8.GetBytes("HELLO");
于 2010-06-01T20:48:58.207 回答