2012-11-27 32 views
2

比方說,我有一個類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網二進制反序列化到它。如何更新序列化文件(可能包含數百或數千個序列化的MyClass對象)中包含的MyClass實例?我看了一些馬克對其他問題提出的意見,並就好像我需要使用Deserialize並傳遞MyClass實例,但唯一的方法簽名我看到的是

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

也許我需要使用合併?我不確定我應該如何使用它。

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

我正在使用protobuf-net v2.0.0.480。

回答

1

聽起來想要更新文件版本的對象 - 是否正確?如果是這樣的話,如果不重寫該文件,這是不可能的 - 這就好比問「如何更新xml文件中間的元素」 - 很容易做到,但是您需要重新編寫整個文件文件。那麼,在技術上你可以重新寫之後你想改變的位,但坦率地說,最簡單的選擇可能是:讀然後重寫。

如果這是你需要做的定期東西,你需要快速追加,我可能會建議(在您的應用程序級)的策略,讓您通過簡單地在追加一個新的版本替換對象結束 - 即如果你看到一個重複的ID,假設代替更早的發生 - 然而,這意味着你的閱讀需要通讀所有內容,所以這可能是一個想法偶爾重新建立基礎。

但最簡單的答案,除非你需要的東西花哨,應該是:

  • 反序列化的內容到一個列表(或類似)
  • 讓你需要的變化
  • 連載
+0

你最後建議的答案是我現在正在做的。我或多或少只是想知道是否可以對文件中的序列化對象進行就地更新。 – Brett