3

クラスがあるとしましょうMyClass

[ProtoContract]
public class MyClass
{
    [ProtoMember(1)]
    public string PropA { get; set; }
    [ProtoMember(2)]
    public string PropB { get; set; }
    // ...
    [ProtoMember(12)]
    public string PropL { get; set; }
}

またList<MyClass>、protobuf-net バイナリが逆シリアル化されています。MyClassシリアライズされたファイル (数百または数千のシリアライズされMyClassたオブジェクトを含む可能性がある)に含まれる のインスタンスをその場で更新するにはどうすればよいですか? マークが他の質問に対して行ったコメントのいくつかを見たところDeserialize、インスタンスを使用して渡す必要があるようですMyClassが、私が見る唯一のメソッドシグネチャは

public static T Deserialize<T>(System.IO.Stream source)

Merge を使用する必要があるのでしょうか。私はそれをどのように使用すべきか本当にわかりません。

public static T MergeWithLengthPrefix<T>(System.IO.Stream source, T instance, ProtoBuf.PrefixStyle style)

私は protobuf-net v2.0.0.480 を使用しています。

4

1 に答える 1

2

オブジェクトのファイルバージョンを更新したいようですが、それは正しいですか?もしそうなら、それはファイルを書き直さなければ不可能です-「xmlファイルの途中で要素を更新するにはどうすればよいですか」と尋ねるようなものです-非常に簡単ですが、全体を書き直す必要がありますファイル。まあ、技術的には、変更したいビットのに何かを書き直すことができますが、率直に言って、最も簡単なオプションはおそらく読み取りしてから書き直すことです。

これを定期的に行う必要があり、高速な追加が必要な場合は、(アプリケーションレベルで)最後に新しいバージョンを追加するだけでオブジェクトを置き換えることができる戦略を提案します。つまり、重複が見られる場合です。 idは、以前のオカレンスを置き換えると仮定します。ただし、これは、読み取りですべてを読み取る必要があることを意味するため、ときどきリベースすることをお勧めします。

しかし、最も簡単な答えは、何か凝ったものが必要でない限り、次のようになります。

  • 内容をリスト(または同様のもの)に逆シリアル化します
  • 必要な変更を加える
  • シリアライズ
于 2012-11-27T09:30:41.440 に答える