2011-06-04 77 views
1

我希望能夠通過序列化/反序列化僅更改的字段來更新對象。 我使用序列化程序的非通用版本,因爲我不知道編譯時的類型。在運行時,我確實有類型。可以使用Protobuf-net部分序列化一個對象嗎?

本地我想要做的事,如:

var existingObject.SomeField = 10; 

// Say I only want to serialize field B 
byte[] serializedField = SerializeField(existingObject, "SomeField") 

遠程我會反序列化,並創建一個新的對象:

Merge(serializedField, existingObject); 

似乎沒有成爲一個辦法做到這一點使用非泛型接口?

回答

1

你有幾個選項。

如果您的類型內部知道發生了什麼變化,則可以使用與XmlSerializer(IIRC)相同的模式,即,即,。

[ProtoMember(12)] 
public string Foo {get;set;} 

public bool ShouldSerializeFoo() { 
    return ... true if Foo is dirty 
} 

第二種選擇是在飛行中創建模型,並只告訴它關於被更改的成員。但是,由於默認情況下會導致(隨着時間的推移)生成大量動態代碼,因此您可能需要將AutoCompile設置爲fse。

第三種選擇是通過ProtoWriter手動序列化。這可能需要更多protobuf的技術訣竅。

+0

謝謝馬克。 ShouldSerialize模式將很有用。說我可以部分序列化它。我如何反序列化?這是我遇到的問題。我用默認值序列化一個對象,除了我設置的單個字段。稍後,我想通過發送新的序列化空對象將對象重置爲默認值。更新的對象非常小,因爲沒有設置字段。將它合併到原始文件中不起作用。我的意圖是將字段設置爲零。所以真的,我想反序列化到一個現有的對象,但首先清除現有的領域。 – Johan 2011-06-06 11:29:58

+0

@Johan - 並不完全遵循。如果您的意思是「如何將更改加載到現有對象中」,那麼這就是「Merge」的用途 - 或者在第2版中 - 只是將該對象傳遞給「反序列化」。 – 2011-06-06 12:17:14

相關問題