2017-01-25 8 views
3

Microsoft Bondには、スキーマが時間とともに進化する方法に関するいくつかのベストプラクティスがありますか?私たちは2ウェイの互換性を持っているようにベストプラクティスに従うようにしたいと思います。つまり、Bondタイプで古いバージョンから現在のバージョンに進化させることができます。また、新しいバージョンから古いバージョンへの変換を可能にする下位互換性もあります。 Avroなどの他のシリアライゼーションフレームワークでは、ドキュメントに明示的に詳細が記載されていますが、ドキュメントで具体的に扱われているとは思いません(例:https://microsoft.github.io/bond/manual/bond_cs.htmlでもhttps://microsoft.github.io/bond/manual/compiler.html#idl-syntax)。Microsoft Bondスキーマの進化のベストプラクティス

私たちは.NET(C#/ F#)で書いており、最初にCompactBinaryWriterとCompactBinaryReaderの書式を使用する予定です。

は例えば、私はこれらの線に沿っていくつかのガイダンスを想像:フィールド序は、名前ではなく、直接(のsimplejsonを除く)フィールドの解決のために使用されているので、フィールドの

  1. 名前は時間の経過とともに変化することができます。私はこれが本当だと信じていますか?新しいフィールドでは、新しいバージョンのフィールドを削除するフィールドをデフォルト値
  2. を与える必要があり、「必要」を追加
  3. は大丈夫です、提供古いバージョンでは、フィールドの種類の変更について
  4. 何を割り当てられたデフォルト値を持っていました?たとえば、バージョン1の文字列フィールドからバージョン2のint64にフィールドを変更できますか?文字列からカスタムユニオン(オプションのフィールドを持つカスタムタイプ)に変更できますか?
  5. その他の推奨事項はありますか?

ありがとうございました!

はまた、任意のアクティブなフォーラムのコミュニティは、マイクロソフトボンドの質問のこのタイプのためにそこにある場合、私はどちらかの明示的なスキーマ展開のガイドラインを認識していないです...

答えて

-1

ボンドのスキーマ展開ルールとベストプラクティスは、今ここで見つけることができます: https://microsoft.github.io/bond/manual/bond_cpp.html#schema-evolution https://microsoft.github.io/bond/manual/bond_cs.html#schema-evolution

+0

ありがとうございます!これは大きな助けとなる – user1521026

+0

フォローアップとして、カスタム構造体の名前変更に関する推奨事項はありますか?私は、スキーマの進化に関して文書で取り上げられていることは見ていない。私はMicrosoft Bond Repoに関する質問をhttps://github.com/Microsoft/bond/issues/595で作成しました。 – user1521026

3

ものを見つけることができませんでした興味があると思い、それは確かにBondのドキュメントのギャップです。ボンドと私自身の仕事から、私はあなたの質問のいくつかに答えることができます:はい、フィールドの名前を変更することができ

  1. を、CompactBinaryフォーマットのために重要なことはすべてのフィールド序数です。
  2. DefaultAttributeは、インターフェイスメンバーでのみ有効です。追加の注釈なしで必須フィールドを追加することはできますが、古いレコード(必要なフィールドを含まない)を逆シリアル化すると、ランタイムエラーが発生することが予想されます。
  3. フィールドを削除できます。デフォルト値は、デフォルトのコンストラクタを使用してオブジェクトをインスタンス化し、それぞれのフィールドを読み出すことによって決定されます。しかし、必要なフィールドを削除すると、古い読者はそれを逆シリアル化することができません(新しい読者はそれをまったく含まないでしょう)。
  4. これは大きな問題ではありません。フィールドのタイプを変更する必要がある場合は、古いフィールドをそのまま残しておき(必要に応じて_Obsoleteのような接尾辞を付けて)、「正しい」タイプの新しいフィールドを導入します。

あなたはF#を使用していると書いていますが、F#固有の変更がいくつかあります。hereを参照してください。これは、レコード、共用体、およびコアF#データ型をサポートします。

更新: Bondのドキュメントにsection on schema evolutionが追加されました。

+0

、あなたのコメントのためのアントンをいただきありがとうございます! F#の開発についてお聞きしたいと思います。あなたが知っている限り、F#コードジェネレータは実際にはありますか?現時点では、C#の自動生成オブジェクトをデシリアライズし、コード内のF#への変換を管理しています(つまり、結合バイナリ→C#→F#)。それが可能かどうか、おそらくは仲介マッピングを取り除き、バイナリからF#に直接移行できるようにするのは興味深いでしょうか? – user1521026

+0

コード生成はまだ計画されていませんが、一見しています。完全性のために、債権保管庫に機能要求を提出することができます。 –

+0

はい、できます。ありがとうございました! – user1521026

関連する問題