为什么我需要刷新并将此序列化代码段中的流位置设置为 0

本文关键字:段中 位置 设置 代码 序列化 刷新 为什么 | 更新日期: 2023-09-27 17:57:07

取自这里:

    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,并在反序列化方法中查找?

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

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

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

为什么我需要刷新并将此序列化代码段中的流位置设置为 0

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

将流内容写入字节数组,而不考虑位置 财产。

因此,我们显然不需要设定位置。同花顺更值得商榷。内存流不太可能在后台缓冲,因为它只是写入内存缓冲区。但是,我不确定它是否记录在内存流不会缓冲的任何地方,因此 Flush() 可能是合理的,因为我们在处理流之前调用 ToArray()。另一种方法是在 using 块之外调用 ToArray()(我们还必须将变量的声明移出)。这将起作用,因为 ToArray() 声明:

此方法在内存流关闭时有效。

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