2012-12-27 35 views
0

我在C#和C++進程之間的高性能IPC上工作。我已經選擇了IPC機制。但是要處理與本機和管理端兼容的序列化。我正在研究protobuf。 但是,當用於IPC的COM也出現二進制序列化。可能是我可以使用它。使用COM二進制序列化作爲C#和C++不可撤銷格式

我應該看看哪些庫和方法? (只是不想添加protobuf如果可以)

+2

COM二進制序列化是什麼意思? COM不會調用序列化(RPC /封送等),而不是對象序列化。 –

+1

COM本身並沒有實現二進制對象序列化,只是提供接口在你的對象中實現它(主要是爲了嵌入OLE對象)。請參閱'IPersist','IPersistStorage','IPersistMemory','IPersistFile','IPersistStream' [MSDN中的文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/ms688695(v = vs.85).aspx) – Rost

+0

@羅斯,謝謝!我可以使用IPersist *模式來要求COM開發人員將其對象佈局爲字節數組。 –

回答

1

是的,COM可以做到這一點。這是一種與proto-buf完全不同的方法,它支持進程外服務器。換句話說,您可以將C++程序編寫爲這樣的服務器,並且您的客戶端代碼可以自動啓動它並開始調用由服務器實現的方法。您想要通過流程邊界獲得的數據可以通過這種方法的參數傳遞。 C#相當於Remoting或WCF。

序列化實際上是COM中的一個弱點,您可能需要提供一個名爲代理/存根的附加代碼,它知道如何對通過參數傳遞的數據進行編碼,以便它可以跨越邊界傳遞。對此有很多工具支持,您首先通過一種名爲IDL(接口描述語言)的語言來描述方法及其參數。然後可以自動編譯成代理/存根DLL。如果您傳遞的數據特別麻煩,那麼您可能需要編寫一個自定義編組器。或者,如果它特別簡單,將自身限制在COM自動化支持的類型的子集上,那麼您可能根本不需要代理/存根,並且可以使用標準編組器。其中使用類型庫,也是從IDL自動生成的。

這裏有很大的靈活性,但這肯定是有代價的。 COM被廣泛認爲是困難。遇到問題時不容易調試。如果「可以理解」是你的主要目標,那麼不要考慮COM,原型buf就容易解決。一步一步,命名管道或套接字很容易在任何運行時環境中進行,但是取消/序列化數據取決於您。你可以通過使用XML來理解。

+0

謝謝!似乎串行化的COM只集成了簡單的類型(布爾,字符串,整數)。複雜的對象應由開發人員完成。我認爲如果表現會好於堅持protobuf。但是如果不好,我會要求C++開發者爲他們的對象進行佈局調整(例如讓他們實現IPersist *)。對於IPC,我們已經使用mem映射文件和命名管道進行了評估,似乎將繼續使用。 –

相關問題