3

私はC ++で次のことをしたい:

  1. コマンド オブジェクトを作成する
  2. それを連載する
  3. (別のコンピュータに送信します)
  4. 逆シリアル化
  5. 実行する

2 つのケース:

  • 送信者と受信者の両方が7台のコンピューターに勝つ
  • 送信者は* nix、受信者はwin 7

シリアル化のチュートリアルを見つけました: http://www.functionx.com/cpp/articles/serialization.htm。これは行く方法ですか?pythonでは、次のことができます:

def setAndPackCommand(self, object):
    outFile = StringIO.StringIO()
    pickledC = pickle.dump(object, outFile) # this packs object to outFile
    stringToSend = outFile.getvalue() # decoding to string

def unpackAndExecute(self, stringToReceive):
    inFile = StringIO.StringIO()
    inFile.write(stringToReceive)
    inFile.seek(0, 0)
    receivedC = pickle.load(inFile)     
    receivedC.execute()

このコードの要点は pickle.dump と pickle.load です。C++ に相当するものは何ですか? ウィキペディアは、C++ はシリアル化をサポートしていないと言っていますか? では、上記のリンクは何ですか?

バイナリ シリアル化とはどういう意味ですか? メモリはディスクにダンプされ、逆シリアル化にはまったく同じコンピューターが必要ですか (クロスプラットフォーム転送は必要ありません)?

br、ユハ

4

3 に答える 3

1

質問に簡単に答えると、Wikipedia は正しいです。C++ はシリアル化をネイティブにサポートしていません。リンクした記事に示されているように、独自のソリューションを展開できないという意味ではありません。

バイナリ シリアル化とは、オブジェクトをバイナリ ファイル形式に書き込むことです。(たとえば) オブジェクトが XML ベースの形式に書き込まれる XML シリアル化とは対照的です。前者では、(たとえば) int4 バイトの生のバイナリ データで構成されるバイナリ ファイルを取得します。後者ではint、属性を持つタグを取得しname、その内容が のような整数のテキスト値である可能性があります<int name="myInt">12345</int>

バイナリ シリアル化の大きな利点は、(ほとんどの場合) 非常にコンパクトであり、ターゲット プラットフォーム上のオブジェクトとの間の変換が非常に簡単なことです。欠点は、あなたが示唆したように、非常にマシン固有になる傾向があるため、状況ではあまり役に立たないことです。バイト順やフィールドの整列などの問題は、プラットフォームごとに異なる傾向があるため、それらが考慮されていないバイナリ形式は移植性がない可能性が高くなります。とはいえ、これらの違いを考慮してコードを追加することはできますが、ソリューションの複雑さが増します。

代替手段 (テキストベースのシリアライゼーション、XML シリアライゼーションなど) には、一般にクロス プラットフォームであり、手動で編集しやすいという利点がありますが、一般に、バイナリ アプローチよりもコンパクトではありません。

上記の理由により、あなたの場合は(可能であれば)バイナリのシリアル化を避け、テキストベースのアプローチを採用します。私が気に入っている記事は、この記事です。この記事では、(特に) シリアライゼーションへのアプローチについて説明しています。これにより、使用したい任意の種類のシリアライゼーション メソッドを簡単に指定できます。

于 2011-03-08T20:16:45.043 に答える
1

boost.serializationデータのシリアル化など、安定したライブラリを使用することもお勧めします。

シリアライゼーションに慣れていない場合は、オブジェクトを転送または保存に適したデータ表現に変換し、そのデータ表現から再構築することを意味します。いわゆるPOD (Plain Old Data objects)の場合、問題はそれほど大きくありません。バッファーをデータとして送信し、転送後にデータの配置バイト順(エンディアン) に注意してキャストすることができます。オブジェクトが他のオブジェクトを参照する場合はさらに複雑になります。その場合、適切に設計されたライブラリを使用することは非常に理にかなっています。Boost のシリアライゼーションはバージョン管理もサポートしているため、フォーマットを更新し、下位互換性のあるリーダーとライターを維持できます (もちろん、ある程度の努力は必要です)。

ここに良い紹介があります。

于 2011-03-08T20:17:51.630 に答える
0

もちろん、C++ プログラムはシリアライゼーションを実行できますが、すぐに使用できるわけではありません。Boost.Serializationライブラリまたは Google のプロトコル バッファを確認してください。後者は、高速で移植可能なクロスプラットフォーム (バイナリ) シリアル化を実装しますが、コード ジェネレーターを使用する必要があります。

(リンク先のチュートリアルは、シリアル化への非常に単純で移植性のないアプローチを示しています。また、C++ で文字列を処理しない方法も非常によく示しています。)

于 2011-03-08T20:07:49.317 に答える