取自这里:
private static string SerializeToString<T>(T value)
{
using (var stream = new MemoryStream()) {
var formatter = new BinaryFormatter();
formatter.Serialize(stream, value);
stream.Flush();
stream.Position = 0;
return Convert.ToBase64String(stream.ToArray());
}
}
private static T DeserializeFromString<T>(string data)
{
byte[] b = Convert.FromBase64String(data);
using (var stream = new MemoryStream(b)) {
var formatter = new BinaryFormatter();
stream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(stream);
}
}
为什么我需要在序列化方法中刷新并将位置设置为 0,并在反序列化方法中查找?
我删除了它们,它们没有影响任何东西。
我知道刷新意味着立即写入流中的任何内容。
但我不知道这里是否有必要...也不确定位置和寻求。
这些示例包含不必要的代码。MemoryStream.ToArray的文档(此处)明确指出:
将流内容写入字节数组,而不考虑位置 财产。
因此,我们显然不需要设定位置。同花顺更值得商榷。内存流不太可能在后台缓冲,因为它只是写入内存缓冲区。但是,我不确定它是否记录在内存流不会缓冲的任何地方,因此 Flush() 可能是合理的,因为我们在处理流之前调用 ToArray()。另一种方法是在 using 块之外调用 ToArray()(我们还必须将变量的声明移出)。这将起作用,因为 ToArray() 声明:
此方法在内存流关闭时有效。
在读取端,您正在创建一个新流,默认情况下从位置 0 开始。因此,不需要 Seek 调用。