将boost :: archive写入C#流

时间:2015-04-08 11:55:48

标签: c# c++ boost c++-cli archive

我想知道是否有人对此有任何见解。

我有一个本机C ++对象(在DLL中)使用boost :: archive写入它的数据。

该项目由C#应用程序(通过C ++ / CLI类)使用,我想将这些存档中的一些存储在压缩文件中。我在C#(DotNetZipFile)中使用Ionic.Zipfile。

目前,我正在写一个临时文件,然后使用ZipFile.UpdateFile添加到存档,但是想避开中间人。

所以,这就是我所希望的:

C#:

ZipEntry ae = archive.UpdateEntry("Project", (f, stream) =>
{
   pManagedObjectWrapper.Save(stream);
});

C ++ / CLI:

void ManagedObjectWrapper::Save(System::IO::Stream ^ stream)
{
    std::ofstream *myofstream = MAGICALFunction(stream);
    pUnmanagedObject->Save(myofstream);
}

C ++:

void UnmanagedObject::Save(std::ofstream *myofstream)
{
    boost::archive::binary_oarchive oa(*myofstream);
    oa << *this;
}

MAGICALFunction是什么的任何帮助?

1 个答案:

答案 0 :(得分:1)

实际上,使用适当的下溢/溢出实现对streambuf进行子类化是可行的方法。

我不记得这很难,但我现在也没有合适的Windows机器,所以你可以四处寻找现成的实现。

资源:

  • 根据我的经验,在SO上找到好工作的小样本并不难:

  • Ed先生有 an excellent blog 文章¹,它向您展示了您开始使用标准库所需的一切。它使用3个不同的例子来驱动点回家。

  • 不要忘记Boost IOStreams。正如埃德先生所说:

      

    如果你在阅读这篇文章之前对流缓冲区不熟悉,我希望你现在对它们感觉更舒服一点。所有的实现都非常基础,但还有更多可能。但是,我发现一旦我开始尝试更多的奢侈缓冲区,事情就会很快变得非常繁琐。这时我将使用Boost IOStreams库,它提供了一个框架,用于实现更多涉及的缓冲区和流。

         

    它还允许您彼此独立地处理源,汇,滤波器和其他概念。在我们的最后一个例子中,我们将接收器硬编码为另一个std :: ostream。如果我们希望数据到某个没有流接口的地方怎么办?通过在我的示例代码中隔离我必须混合的概念,Boost IOStreams库在这个领域提供了更大的灵活性。

  • cppreference有the best ever visual explanation of stream buffers

    enter image description here

¹http://www.mr-edd.co.uk/blog/beginners_guide_streambuf