我正在测试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
有没有办法只返回编码为字节的数据而没有所有无关的信息?
答案 0 :(得分:6)
所有这些无关的信息告诉另一个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();
}
答案 1 :(得分:2)
对于简单字符串,请使用BinaryWriter。开销将减少到一个小长度前缀。
BinaryFormatter用于序列化(复杂)对象集群,并且需要一些辅助数据结构来执行此操作。
答案 2 :(得分:2)
这取决于你真正想要的。您可以使用Encoding.UTF8.GetBytes。
从字符串中获取UTF8字节数组答案 3 :(得分:2)
你不应该剥夺所有那些“无关”的信息。当您想要从序列化数据中重构对象时,反序列化器在另一端需要它。
答案 4 :(得分:2)
您是否只是想将字符串转换为字节数组?如果这是你的目标,你可以做更多的事情:
byte[] bits = System.Text.Encoding.UTF8.GetBytes("HELLO");