将boost::archive写入C#流

3
我想知道是否有人对此有任何见解。
我有一个本地的C++对象(在DLL中),它使用boost::archive写入其数据。
该项目由C#应用程序(通过C++/CLI类)使用,并且我想将多个这些存档存储在一个压缩文件中。我正在使用C#中的Ionic.Zipfile(DotNetZipFile)。
目前,我正在写入到临时文件,然后使用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的任何帮助?


您可能需要使用一个类作为适配器,通过子类化streambufostream并将其传递给System.IO.Stream,然后将其传递给UnmanagedObject::Save()。这不是一个容易上手的事情。 - xanatos
1个回答

1

确实,使用适当的underflow/overflow实现来子类化streambuf是可行的方法。

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

资源:

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

  • Ed 先生有一篇优秀的博客文章¹,展示了你实际上需要使用标准库开始入门的所有内容。它使用了三个不同的示例来阐明观点。

  • 别忘了 Boost IOStreams。正如 Ed 先生所说:

    如果在阅读此帖子之前您对流缓冲区是新手,那么我希望您现在对它们感到更加舒适。 所有实现都相当基本,但还有很多可能性。 但是,我发现一旦我开始尝试更奢华的缓冲区,事情就会变得非常棘手。 这时我会寻找 Boost IOStreams 库,该库提供了实现更复杂的缓冲区和流的框架。

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

  • cppreference 有最好的流缓冲区可视化解释

    enter image description here

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

¹ {{链接1:http://www.mr-edd.co.uk/blog/beginners_guide_streambuf}}


说实话,我还没有尝试过这个,因为我现在没有那么多时间来处理它。我真的希望能得到一个简单的答案,但目前只能继续保持事情原样。然而,这是目前为止我所知道的最好的答案,所以我标记了它。 - David Hope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接