Вопрос

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

При использовании его со строкой привет, и я преобразую память в массив, он дает мне 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

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

Это было полезно?

Решение

Вся эта посторонняя информация сообщает другому бинарноформаттеру (которая покинет объект) что будет тип объекта детериализируется (в данном случае, 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();
        }

Другие советы

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

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

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

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

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

byte[] bits = System.Text.Encoding.UTF8.GetBytes("HELLO");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top