BinaryFormatter с вопросом о MemoryStream

Я тестирую BinaryFormatter, чтобы видеть, как он будет работать на меня, и у меня есть простой вопрос:

При использовании его со строкой ПРИВЕТ, и я преобразовываю 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

Существует ли способ только возвратить данные, закодированные как байты без всей посторонней информации?

6
задан 1 June 2010 в 20:44
поделиться

5 ответов

Вся эта посторонняя информация сообщает другому BinaryFormatter (который будет десериализовать объект), какой тип объекта десериализуется (в данном случае System.String ). В зависимости от типа он включает в себя другую информацию, необходимую для восстановления объекта (например, если бы это был StringBuilder , там также была бы закодирована Capacity .

Если бы все было вы хотите поместить строку в буфер MemoryStream :

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

            byte[] bytes = ms.ToArray();
        }
6
ответ дан 8 December 2019 в 17:19
поделиться

Для простой строки используйте BinaryWriter. Накладные расходы будут сокращены до префикса небольшой длины.

BinaryFormatter предназначен для сериализации (сложных) кластеров объектов и требует для этого некоторых вспомогательных структур данных.

2
ответ дан 8 December 2019 в 17:19
поделиться

Это зависит от того, чего вы на самом деле хотите. Вы можете получить массив байтов UTF8 из строки с помощью Encoding.UTF8.GetBytes.

2
ответ дан 8 December 2019 в 17:19
поделиться

Не отбрасывайте всю эту "постороннюю" информацию. Он нужен десериализатору на другом конце, когда вы хотите восстановить объект из сериализованных данных.

2
ответ дан 8 December 2019 в 17:19
поделиться

Вы просто пытаетесь преобразовать строку в массив байтов? Если это ваша цель, вы можете сделать что-то вроде:

byte[] bits = System.Text.Encoding.UTF8.GetBytes("HELLO");
2
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: