1

データベーステーブル内のprotobufsをByte[]として保存しています。ただし、保存後にプロトバフを更新する必要がある状況に直面しています。これにより、2つの問題が発生します。(1)シリアル化/逆シリアル化して更新して保存し直す必要があります。(2)更新コードでprotobuf階層を複製する必要があります(obj.getType()== typeOf(Aの場合) ))then ... else(type ==の場合)do..。

protobufタイプをシリアル化/逆シリアル化および識別せずにByte[]を変更する方法はありますか?

ありがとうマニッシュ

4

1 に答える 1

1

プロトコル バッファ形式は、一般に不透明な形式として使用されます。つまり、内部を知る必要はありません。典型的なシナリオでは、単にロードして変更を加え、永続化するだけです。幸いなことに、形式は簡潔で効率的であるため、これが問題になることはめったにありません。

BinaryFormatter比較として、を使用せずにデータを編集することは期待できません。BinaryFormatterほとんどの人はまだシリアライザーを使用して xml / json を変更します。形式が非常に複雑であり、バニラ コードを記述しようとする価値がないためです。それはそれを堅牢に処理します。

でも!シリアライザーを使用せずに protobuf データを操作する場合は、リーダー/ライター API を使用することもできます。これは、XmlReader/と同様にXmlWriter、基礎となる仕様についてかなり知っていることを前提としており、関心のあるフィールド番号を知る必要があります (ただし、そうでないフィールドについてはあまり知る必要はありません)に興味がある)。

非常に具体的な(つまり、実行可能な) 例があれば、おそらくその方法を示すことができます。でも!最も簡単な方法は、おそらくモデルを手元に置いておくことです。

ただし、「protobuf 階層を複製する」必要がある理由が少しわかりません。Protobuf-net は、デフォルトの使用法では、実際の型が何であるかをまったく気にしません(契約を満たしている限り)。DTO に変更を加えるというシナリオの場合は、次のようになります。

  1. はい、DTO に重大な変更を加えるなどの危険なことを行うと、物事に影響を与える可能性があります-それが痛い場合は、それをやめてください(通常、DTO を時間の経過とともに変更するための同様に便利ですが安全な方法があります)
  2. 多くの場合RuntimeTypeModel、v2 の機能を使用して、モデルの 2 つのバージョン間の違いをシムすることができます - 2 つの異なるRuntimeTypeModel構成 (おそらく、そのうちの 1 つがサロゲートを含むか、異なるプロパティを使用するなど) を持つことによって。

ただし、さらにアドバイスするには、解決しようとしている問題を確認する必要があります。

于 2012-06-07T20:27:48.810 に答える