BinaryFormatter с вопросом о MemoryStream - PullRequest
6 голосов
/ 02 июня 2010

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

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

Ответы [ 5 ]

6 голосов
/ 02 июня 2010

Вся эта посторонняя информация сообщает другому 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();
        }
2 голосов
/ 02 июня 2010

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

byte[] bits = System.Text.Encoding.UTF8.GetBytes("HELLO");
2 голосов
/ 02 июня 2010

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

2 голосов
/ 02 июня 2010

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

2 голосов
/ 02 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...