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

时间:2014-08-31 14:52:24

标签: c# serialization deserialization memorystream

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

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

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

编辑2:不幸的是,我使用.Net 2.0。我无法利用Stream.CopyTo :(

2 个答案:

答案 0 :(得分:1)

我相信会提出很多涉及的技巧。我不喜欢复杂的序列化格式。

如果性能不是一个大问题,请考虑只序列化两个字节数组。像那样:

class MyFileContents {
 public byte[] Part0;
 public byte[] Part1;
}

new BinaryFormatter().Serialize(myStream, new MyFileContents(...));

快速实施。很少会出错。

还要考虑协议缓冲区。

答案 1 :(得分:0)

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

    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;
    }