Я тестирую 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
Существует ли способ только возвратить данные, закодированные как байты без всей посторонней информации?
Вся эта посторонняя информация сообщает другому 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();
}
Для простой строки используйте BinaryWriter. Накладные расходы будут сокращены до префикса небольшой длины.
BinaryFormatter предназначен для сериализации (сложных) кластеров объектов и требует для этого некоторых вспомогательных структур данных.
Это зависит от того, чего вы на самом деле хотите. Вы можете получить массив байтов UTF8 из строки с помощью Encoding.UTF8.GetBytes.
Не отбрасывайте всю эту "постороннюю" информацию. Он нужен десериализатору на другом конце, когда вы хотите восстановить объект из сериализованных данных.
Вы просто пытаетесь преобразовать строку в массив байтов? Если это ваша цель, вы можете сделать что-то вроде:
byte[] bits = System.Text.Encoding.UTF8.GetBytes("HELLO");