在一个文件C#中保存和加载多个内存流

本文关键字:保存 加载 内存 一个 文件 | 更新日期: 2023-09-27 18:20:04

我有两个内存流,每个内存流都包含序列化结构。

是否可以将这两个流合并为一个文件,以便以后可以读取并提取回原始的两个内存流?

EDIT:我应该指定,我的数据被分为两个流的原因是因为它们所包含的对象需要在不同的时间进行反序列化。谢谢

编辑2:很遗憾,我使用的是.Net 2.0。我无法利用流。CopyTo:(

在一个文件C#中保存和加载多个内存流

我相信会提出许多相关的技术。我不喜欢复杂的序列化格式。

如果性能不是什么大问题,可以考虑序列化两个字节的数组。比如:

class MyFileContents {
 public byte[] Part0;
 public byte[] Part1;
}
new BinaryFormatter().Serialize(myStream, new MyFileContents(...));

快速实施。很少会出错。

还要考虑协议缓冲区。

这里我给你写了一个小代码片段:

    public void CombineStreams(Stream src1, Stream src2, Stream dstStream)
    {
        using (var writer = new BinaryWriter(dstStream))
        {
            writer.Write((int) src1.Length);
            src1.CopyTo(dstStream);
            writer.Write((int) src2.Length);
            src2.CopyTo(dstStream);
        }
    }
    public void ReadCombinedStreams(Stream srcStream, out Stream outStream1, out Stream outStream2)
    {
        outStream1 = ReadInnerStream(srcStream);
        outStream2 = ReadInnerStream(srcStream);
    }
    private Stream ReadInnerStream(Stream stream)
    {
        int length;
        byte[] content;
        using (var reader = new BinaryReader(stream))
        {
            length = reader.ReadInt32();
            content = reader.ReadBytes(length);
        }
        var result = new MemoryStream(length);
        result.Write(content, 0, length);
        result.Seek(0, SeekOrigin.Begin);
        return result;
    }