1

この質問は、主にyaml-cppの使用法に関する質問をここに投稿するように要求したyaml-cppの作成者(Jesse Beder)を対象としています。

yaml-cppドキュメントを含む多くの場所で、 http: //code.google.com/p/yaml-cpp/wiki/HowToEmitYAML#Using_Existing_Nodes

yaml-cppはメモリ内の既存のYAML::Nodeオブジェクトを変更する方法を提供しないとおっしゃいましたが、メモリ内のYAMLを変更するための提案は次のとおりです。

  1. 独自のデータ構造を使用してYAMLをメモリに保存し、シリアル化時にyaml-cppにフィードバックします(これは基本的にYAML :: Nodeでのポリモーフィズムの再実装に要約され、yamlの多くの再実装と大差ありません- cpp)、または

  2. 「現在、これを行うための最良の方法は、エミッターを使用して、ノードの子から選択することです」、つまり、ドキュメントに示されている例です。このアプローチの問題は、最も単純な場合にのみうまく機能することです。マップの要素の1つ自体がリストである、一連のマップに要素を追加したいとしますか?これは非常に迅速に任意に複雑になる可能性があります!新しいデータを挿入する場所を見つけ、マニピュレータを出力します。これはすべて「手作業」で行う必要があります。

問題を悪化させるために、エミッターはフォーマッターであり、その唯一の出力は文字列であるため、私の唯一のオプションは、変更を加えたYAMLドキュメント全体を出力し、それを新しいメモリ内表現に再解析することです。ドキュメントに多くの変更を加えている場合、この操作の効率のフットプリントはすぐに増加します。

既存のノードの変更には実装上の課題があることを理解しています(ノードのデータまたは子ノードのデータへの既存の参照をどのように処理しますか?)。ただし、新しい独立したノードをオンザフライで作成してメモリ内ツリーに挿入できるようにすることは、少なくとも簡単なことのように思えます。これは、たとえば、JsonCppの実装方法です:http: //jsoncpp.sourceforge.net

これにより、少なくとも、文書化した「エミッター」アプローチが、非効率的である場合でも、実行可能な回避策となる可能性があります。

これらの問題についてご意見をいただければ幸いです。残念ながら、これらの制限は非常に厳しく、yaml-cppが唯一のC ++ / OO YAMLライブラリであることを考えると、JSONに切り替える以外に実用的な代替手段があるのではないかと思います。

よろしくお願いします!

4

1 に答える 1

1

ただし、新しい独立したノードをオンザフライで作成してメモリ内ツリーに挿入できるようにすることは、少なくとも簡単なはずです。

私はこれをやりたいのですが(JsonCpp here を見てきました)、3つの問題があります:

  1. YAML と JSON には違いがあります。YAML は null ノードと存在しないノードを区別します。

  2. yaml-cpp の現在の動作は、存在しないノードが要求されたときに例外をスローすることです。

  3. YAML では、マッピングは任意のキーを持つことができます。

問題 2 については、現在の動作を (大部分!) 変更する必要がある可能性が高いことを意味し、トリガーを引くのを躊躇します。

たとえば、JsonCpp では、次のように記述します。

 root["encoding"];

存在しない場合は、デフォルト ノードが作成されます。yaml-cpp では、存在しない場合は例外がスローされます。人々は次のようなコードに依存している可能性があります。

try {
  root["encoding"]; // etc
catch(const YAML::Exception&) {
  // does not exist
}

最後に、問題 #3 では、マッピングであるキーをどのように指定しますか? そして誰かが書いたら

root[1] = 5;

最初の要素がnullのシーケンスとしてインスタンス化するrootか、単一のキーと値のペアを持つマッピングとしてインスタンス化します{1, 5}か? 後者の場合 (より自然に思えます)、

root[0] = 3;
root[1] = 5;

root[1] = 5;
root[0] = 3;

直感に反する異なる動作をします。

基本的に、結論として、私はこれについて考えましたが、十分な API を思いつくことができませんでした。やってみたいので、何か思いついたら教えてください。

そうは言っても、stackoverflow がこのような議論に最適な場所であるかどうかはわかりません (多くの人が wiki にハウツーの質問を投稿していたので、yaml-cpp サイトに書きました) - 気軽に私を送ってください。メール(私のユーザーページにあります)。

于 2011-09-02T17:16:53.180 に答える