BinaryFormatter с вопросом MemoryStream

Я тестирую 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

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


person Community    schedule 01.06.2010    source источник


Ответы (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();
        }
person Toby    schedule 01.06.2010
comment
Примечание: конструктор StreamWriter внутри создает экземпляр UTF8Encoding для фактического преобразования в байты. Если все, что вам нужно, это массив байтов, соответствующих строке, то MemoryStream и TextWriter на самом деле не являются решением — это просто случайный способ неявного создания класса, который предоставляет решение. Просто используйте Encoding.UTF8.GetBytes напрямую — или используйте правильный класс кодировки для требуемой кодировки символов (UTF-8 — хороший выбор по умолчанию). - person Daniel Earwicker; 02.06.2010

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

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

person Henk Holterman    schedule 01.06.2010

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

person Daniel Earwicker    schedule 01.06.2010

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

person dthorpe    schedule 01.06.2010

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

byte[] bits = System.Text.Encoding.UTF8.GetBytes("HELLO");
person Community    schedule 01.06.2010