2015-04-08 26 views
3

我想知道是否有人對此有任何見解。寫助推::歸檔到C#流

我有一個本地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是什麼?

+0

你可以/需要繼承'streambuf'或'ostream'與充當[A類(http://en.wikipedia.org/wiki/Adapter_pattern#Class_Adapter_pattern)添加到'System.IO.Stream'中,然後將它傳遞給'UnmanagedObject :: Save()'。不是因爲內心的淡淡。 – xanatos

回答

1

實際上,通過適當的下溢/溢出實現子流化streambuf是一種方式。

我不記得這是非常困難的,但我現在也沒有合適的Windows機器可用,因此您可以四處尋找現成的實現。

資源:

  • 在我的經驗,這不是很難找到好的工作,小樣本的SO正確:

  • 艾德先生有an excellent blogarticle¹顯示你,你確實需要開始使用只是標準的一切圖書館。它使用3個不同的例子來推動這一點。

  • 不要忘了升壓IOStreams。正如Ed先生所說:

    如果您在閱讀本文之前是流緩衝區的新手,我希望您現在對它們感覺更舒適一些。所有的實現都非常基礎,但更多的是可能的。然而,我發現,一旦我開始嘗試更加奢華的緩衝區,事情會變得非常快。這是當我到達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

+0

老實說,我沒有試過這個,因爲我現在沒有那麼多時間去處理它。我真的希望有一個簡單的答案,現在必須保持原樣。但是,這是最好的答案(據我所知),所以我標記爲這樣。 –