【问题标题】:writing boost::archive to C# stream将 boost::archive 写入 C# 流
【发布时间】:2015-06-13 08:49:14
【问题描述】:

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

我有一个本地 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 有什么帮助吗?

【问题讨论】:

  • 您可以/需要将streambufostream 子类化为一个充当adapterSystem.IO.Stream 的类,然后将其传递给UnmanagedObject::Save()。不适合胆小的人。

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


【解决方案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:

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

【讨论】:

  • 老实说,我没有尝试过这个,因为我现在没有那么多时间来研究它。我真的希望有一个简单的答案,现在必须保持原样。但是,这是最好的答案(据我所知),所以我将其标记为这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
相关资源
最近更新 更多