为什么我需要在此序列化片段中刷新并将流位置设置为0?

时间:2014-04-07 01:23:32

标签: c# serialization stream flush

取自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方法中查找?

我删除了它们,它们没有任何影响。

我知道刷新意味着立即写出流中的任何内容。

但我不知道这里是否有必要......也不确定这个位置和寻求。

1 个答案:

答案 0 :(得分:2)

这些示例包含不必要的代码。 MemoryStream.ToArray(here)的文档明确指出:

  

将流内容写入字节数组,而不管位置如何   属性。

因此,我们显然不需要设定位置。同花顺更有争议。内存流非常非常不可能在内部缓冲,因为它无论如何只是写入内存缓冲区。但是,我不确定记录流是否会在缓冲区中记录,因此Flush()可能是合理的,因为我们在处理流之前调用了ToArray()。另一种方法是在使用块之外调用ToArray()(我们也必须将变量的声明移出)。这将起作用,因为ToArray()声明:

  

当MemoryStream关闭时,此方法有效。

在读取端,您正在创建一个新流,默认情况下从位置0开始。因此,不需要寻求呼叫。