背景は次のとおりです。C++ でデータ ログを書き込む従来のプログラムがあります。データは異なる構造に含まれています。ログ ファイルを読み取るプログラムは、同じ構造を使用してデータを表示します。ログ ファイルと C# を読み取るプログラムを書き直し、それらすべての構造の C# コピーを手動で作成する必要がありました。これを行うより良い方法はありますか?構造へのルックアップ パスと、ビルド時に C# 構造を生成する一種のパーサーを設定することを検討しましたが、すべての特殊なケースを処理するのは非常に複雑に思えます。これを行うための提案はありますか? C/C++ 構造を処理するための後方互換性が C# にないというのは、ばかげているように思えます。
質問する
179 次
2 に答える
1
構造はいくつあり、どれくらい複雑ですか?
それはコスト対ベネフィットの問題だと思います。あなたの質問から判断すると、C# で構造体をすばやくコーディングすることが最善の方法であると確信しています。
ちょうど私の 2 セント、税引前...
于 2013-10-02T13:08:09.667 に答える
0
問題の概要: ディスクにシリアル化する既存の C++ プログラムに多数の構造体があります。構造体を C# に移植して、データをディスクから C# プログラムに逆シリアル化できるようにします。これを一度だけやりたいわけではありません。両方のプログラムが進化するにつれて、構造体の 2 つのセットを同期させたいと考えています。
必要なのは、言語に依存しない方法でデータを記述できるインターフェイス定義言語 (IDL)です。Apache Thrift、Google Protocol BuffersまたはMessagePackのようなもの。
実行する必要がある手順は次のとおりです。
- 既存の C++ 構造体を IDL に変換します。これは 1 回限りのプロセスです。カスタム スクリプトを使用するか、既存のスクリプトを探します。誰かが今までにこれを解決したに違いありません。
- ビルド時に C# と C++ の両方の定義を生成するようにビルド システムをセットアップします。
- Thrift/ProtoBuf/MessagePack C# および C++ API を使用して、必要に応じてデータをシリアル化および逆シリアル化します。
欠点は次のとおりです。
- ビルド時のコード生成が必要です。しかし、あなたはすでにこれを自分で考えており、このようにして作業はすでにあなたのために行われています.
- 生成されたデータ構造を正しく使用するには、C++ と C# の両方を変更する必要があります。
- バイナリ オン ディスク フォーマットが変更されるため、レガシー ログを読み取ることができなくなります。ただし、C++ を記述して新しい形式に変換するのは非常に簡単です。
これは、次の利点が勝ると思います。
- IDL には、データの正規の記述が含まれます。これに対する変更は、C++ と C# の両方に反映されます。C++ バージョンが変更されたときに、C# バージョンを手動で更新する必要はありません。
- バイナリ データ形式はマシンに依存しません。さまざまなプラットフォームでさまざまな言語からデータを読み書きできるようになります。
- 私が言及したサードパーティのライブラリは堅牢で、広く使用されています。自分で何かをハッキングするよりはましです。
于 2013-10-02T13:41:48.443 に答える