2011-12-22 38 views
11

該方法接受一個整數作爲最後一個參數,但我不確定我是否明白我將如何使用它。什麼是protobuf-net SerializeWithLengthPrefix標記參數?

Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]); 

對於相應的Deserialize方法也是如此。

它只是一種標記消息的方法,以在反序列化中添加某種「查詢」功能來過濾不需要的消息或者是否有其他用法?

回答

9

基本上,它是一個額外的標記物可以是(雖然不必是)使用時要注意的消息的「類型」被加入,由於推定(使用*WithLengthPrefix方法時)的有是同一個流中的多條消息。

通過被包括,它也意味着整個複合流是本身完全有效的protobuf消息。

方式使用此的:

  • 可以序列一個List<Foo>,然後反覆反序列化(帶長度前綴)個別Foo物品,或反之亦然
  • 與非均相對象集,你可以使用Serializer.NonGeneric API來允許基於標籤的類型解析,即代碼等價於「if 1 then invvoice; if 2 then order,if 3 then skip it,if 4 then Customer」等等 - 這是特別有用的如果使用NetworkStream作爲消息發送設備。這種方法(使用每個類型不同的標籤)允許您讀取對象的料流,正確反序列化他們,事先不知道下一個消息的

這是可能的,如果你省略這想要 - 只是通過零(IIRC)。這會爲每個消息添加一個字節(通常爲),但是:這意味着該流不再是有效的protobuf本身。當然,閱讀時仍然可以讀取零。

+1

爲什麼包含標籤使其成爲有效的protobuf消息? 你不能反序列化沒有標籤的列表中的單個項目嗎? – Simone 2011-12-22 09:38:06

+0

此外,使用標籤鍵入分辨率必須由應用程序代碼執行,對嗎? – Simone 2011-12-22 09:43:58

+1

@Simone它使得* composite *消息成爲一個有效的protobuf,因爲重複的MessageType(在.proto中)被編碼爲一個「[tag] [length] [payload] ... [tag] [length] [有效載荷]」。因此,使用標籤它是一個有效的protobuf,沒有:它不是。重新分辨率;通常是的,因爲它是有意平臺獨立的;然而,protobuf-net還包含一些*額外*支持,用於在電線上包含一些有限類型的信息。 – 2011-12-22 11:21:48