取自here:
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);
}
}
为什么我需要在serialize方法中刷新并将位置设置为0,并在deserialize方法中查找?
我删除了它们,它们没有任何影响。
我知道刷新意味着立即写出流中的任何内容。
但我不知道这里是否有必要......也不确定这个位置和寻求。
答案 0 :(得分:2)
这些示例包含不必要的代码。 MemoryStream.ToArray(here)的文档明确指出:
将流内容写入字节数组,而不管位置如何 属性。
因此,我们显然不需要设定位置。同花顺更有争议。内存流非常非常不可能在内部缓冲,因为它无论如何只是写入内存缓冲区。但是,我不确定记录流是否会在缓冲区中记录,因此Flush()可能是合理的,因为我们在处理流之前调用了ToArray()。另一种方法是在使用块之外调用ToArray()(我们也必须将变量的声明移出)。这将起作用,因为ToArray()声明:
当MemoryStream关闭时,此方法有效。
在读取端,您正在创建一个新流,默认情况下从位置0开始。因此,不需要寻求呼叫。