2016-05-27 9 views
1

Das Objekt wurde in C++ - MFC unter Verwendung der CObject::Serialize()-Methode serialisiert.Ist es möglich, ein Objekt in C# zu deserialisieren, das in C++ MFC binär serialisiert wurde?

Ich möchte in C# deserialisieren.

Ist das überhaupt möglich?

+0

Hast du damit sagen, ‚Ich möchte in C++ deserialisieren‘? – Smeeheey

+0

Ich glaube, er wollte sagen "Das Objekt wurde in * C++ * MFC" serialisiert. –

+0

Entschuldigung, habe meinen Fehler bearbeitet, jetzt ist es richtig –

Antwort

1

Ist das überhaupt möglich?

Kurze Antwort: Nein.

MFC-de-Serialisierung erzeugt nicht verwaltete Objekte auf dem nicht verwalteten Heap, und es muss Zugriff auf die jeweilige Klasse CRuntimeClass, sowie die auf dem Werk globale Struktur-Mapping-Klassennamen des Frameworks Methoden. Letztere sind insbesondere nicht von C# aus zugänglich.

Was Sie ist die serialisierte Binärstroms lesen tun, und rekonstruieren die Informationen werden in verwalteten Objekten gespeichert. Das binäre Dateiformat ist dokumentiert unter TN002: Persistent Object Data Format1). Dadurch können Sie diese verwalteten Objekte nicht wieder in einen MFC-kompatiblen Binärdatenstrom serialisieren (es sei denn, Sie implementieren das Dateiformat auch in Ihren verwalteten Klassen neu).


1) Anmerkung: Die binäre Darstellung jedes Objekts in dem serialisierten Strom wird in seiner Klasse CObject::Serialize Überschreibung kodiert. Die Kenntnis des gesamten Dateiformats reicht nicht aus, um einen MFC-serialisierten Stream zu deserialisieren. Sie müssen auch den Serialisierungscode jedes Objekts kennen.

2

Ja, es ist möglich ...

jedoch, ob Sie es tun wollen würde, ist eine andere Sache. Das MFC-Serialisierungsformat ist auf das MFC-Framework ausgerichtet. Es codiert die Namen von MFC-Klassen in den serialisierten Daten, für die Sie versuchen sollten, eine äquivalente C++ - Klasse für zu finden.

Ihre beste Wette wäre, eine Sprache Agnostiker Serialisierungsformat zu verwenden und dass Ihre Daten zur Serialisierung verwenden. JSON, XML oder Protobuf sind dafür gut geeignet.

+0

* "Ja, es ist möglich ..." * - Ok, ich beiße. Wie? Selbst eine grobe Skizze würde reichen. – IInspectable

+0

@Intspectable - Sie müssten das MFC-Serialisierungsformat reverse engineeren und Mappings für Typen von C++ bis C# bereitstellen. Zum Beispiel würden Sie "CString" auf "string", "CArray" auf "List" usw. umwandeln. Es wird nicht einfach oder hübsch sein, und der Wechsel zu einem sprachunabhängigen Format wird einfacher! – Sean

+0

Nun, nein. Sie müssen das Dateiformat nicht reverse-engineeren. Es ist dokumentiert. Das ist der einfache Teil, und das bringt Sie nur zu dem Punkt, wo Sie den Container verstehen. Du weißt immer noch nicht, was du von den Inhalten halten sollst. Mit anderen Worten: Sie wissen vielleicht nicht einmal, dass Sie es mit einem 'CString' oder' CArray' zu tun haben, um das triviale Mapping durchzuführen. (Übrigens hätten Sie bei der Verwendung von XML die gleichen Probleme.) Wenn Sie nicht mehr bieten möchten, sollte Ihre einleitende Pointe lauten: * "Nein, nicht wirklich ..." * – IInspectable

Verwandte Themen