2011-01-13 19 views
5

Ich arbeite an einer verteilten Anwendung, die zwei Komponenten hat. Einer ist in Standard C++ geschrieben (nicht verwaltet C++ und läuft auf einer Linux-Plattform) und der andere ist in C# geschrieben. Beide kommunizieren über einen Nachrichtenbus.Binäre Serialisierung/Deserialisierung in C++ und C#

Ich habe eine Situation, in der ich Objekte von C++ an C# -Anwendung übergeben muss und dafür muss ich diese Objekte in C++ serialisieren und sie in C# deserialisieren (etwas wie Marshalling/Un-Marshalling in .NET) . Ich muss diese Serialisierung in binär und nicht in XML durchführen (aus Leistungsgründen).

Ich habe Boost.Serialization verwendet, um dies zu tun, wenn beide Enden in C++ implementiert wurden, aber jetzt, dass ich eine .NET-Anwendung an einem Ende habe, Boost.Serialization ist keine praktikable Lösung.

Ich bin auf der Suche nach einer Lösung, mit der ich (de) Serialisierung über C++ und .NET-Grenze, d. H. Cross-Plattform-Binär-Serialisierung.

Ich weiß, dass ich den (De-) Serialisierungscode in einer C++ - DLL implementieren und P/Invoke in der .NET-Anwendung verwenden kann, aber ich möchte das als letzten Ausweg behalten.

Auch ich möchte wissen, ob ich einige Standard wie gzip verwenden, wird das effizient sein? Gibt es noch andere Alternativen zu gzip? Was sind die Vor-/Nachteile von ihnen?

Dank

+0

Mein bester Vorschlag ist es NICHT zu tun. Verwenden Sie json, xml oder etwas anderes, um Ihre Daten zu übertragen. Implementiere das FIRST, wenn es zu langsam endet, dann analysiere, was Zeit braucht ... – Cine

+1

Ich begann mit der XML-Serialisierung und es erwies sich als langsamer im Vergleich zur binären Serialisierung (mit beiden Enden läuft eine C++ - Anwendung). Aus diesem Grund habe ich Boost.Serialization auf den ersten Platz gewählt. –

+0

Haben Sie überlegt, eine einfache COM-Anwendung, C++ und.NET unterstützt COM-Technologie, soweit ich weiß. –

Antwort

4

gzip nicht direkt Hilfe bei der Serialisierung - es wird nur (Versuch) einen Strom schrumpfen. Diese kann Hilfe, oder nicht, abhängig von der Menge der duplizierten Daten im Stream. Für dichte Daten mit wenig Text habe ich gzip Erhöhung die Größe der Nutzlast gesehen.

Persönlich würde ich mich hier protocol buffers ansehen (aber ich bin voreingenommen, wie ich einer der Autoren der many extensions bin). Normalerweise (aber nicht immer) definieren Sie die Nachrichten in einer Basissprache (eine .proto-Datei) und führen sprachspezifische Tools aus, um die Klassen zu generieren. Die Leistung ist sehr gut - auf .NET konzentrieren kann weit die eingebauten Serializer überschreiten (123)

+0

+1 für das Vorschlagen von PB –

5

würde ich Protocol Buffers, empfehlen die Googles eigene Serialisierung Bibliothek ist. Es hat sowohl .NET, C++ und Java-Serialisierer. Die meisten Implementierungen sind auch ziemlich schnell.

http://code.google.com/p/protobuf/

+0

Danke für den Vorschlag. Ich würde mich darum kümmern. –

3

Eine andere Möglichkeit Thrift wäre, hat es noch mehr Backends und bei Bedarf liefert einen guten Teil des Codes erforderlich für Netzwerkkommunikation - falls Sie skalieren möchten.

Wenn Sie nur einfache Objektserialisierung wollen, würde ich einen Blick auf json.org werfen. Es gibt viele C++/.NET-Implementierungen um.