2017-07-19 95 views
1

我正在從DataContractSerializer遷移到ProtoBuf。我們之前注意到的一件事是,通過將DataContract的IsReference =true與XML序列化程序一起使用會產生巨大的影響。在ProtoBuf上使用AsReferenceDefault = true會有什麼性能影響

我想知道是否有一些關於我們使用ProtoContractAsReferenceDefault = true會發生什麼的參考。

對串行化/反序列化的速度有什麼影響?什麼是對序列化的影響?問題:所有對一個對象的引用都有IsReference = true,或者我可以擁有主對象(真正擁有對象的地方,我期望有對象序列化的地方)一個IsReference = false並且仍然只有一個同一個對象的實例?

回答

1

此標誌改變了一些事情:

序列化時
  • ,這意味着通過這種方式標註的每一個對象,它需要檢查的參考查找,看它是否已經看到它;這不應該是特別慢,但它需要發生
  • 則需要編寫額外的抽象層額外的工作 - 本質上是一個包裝對象中要包括預先存在的對象ID或新對象ID加上對象有效載荷(對於好奇 - 1(現有對象)或字段210(新對象)設置,這被形成爲來自bcl.protoNetObjectProxy);這也會佔用每個參考空間的一小部分空間(但空間少於重複序列化對象的空間)
  • 對於其他實現來說,這個額外的層稍微尷尬(但並非不可能);基本上核心protobuf API沒有對象標識的概念,所以這是一個庫特定的添加;如果你只是使用protobuf網你應該罰款

至於如何在現實中增加了:它會根據不同場景來,我很想聽聽你的發現。

再在你需要AsReference:如果通過AsReferenceDefault沒有指定,它會需要對你想到哪裏去發生參考跟蹤所有成員規定。支票是在個人會員級別應用,基本上形式(雖然這不是實際的代碼):

bool asRef = member.AsReferenceSpecified() 
    ? member.AsReference : metaType.AsReferenceDefault; 
+0

好感謝,我會嘗試測試(不知道怎麼看的差異)。有沒有一種方法可以爲整個序列化器指定AsReference?另外,我感覺無論根節點被標記爲「AsReferenceDefault」,它都不會被相應地序列化。根據我的測試,它總是一個不同的參考。這是預期的行爲? – J4N

相關問題