1 回答

TA貢獻(xiàn)1828條經(jīng)驗 獲得超13個贊
選項1:告訴在可選構(gòu)造函數(shù)重載中使用的正確字節(jié)數(shù);這將適用于所有序列化程序。MemoryStream
選項2,特別是對于原始buf-net:使用;API 接受 a 或 a ;后者可以用名義長度構(gòu)建,不會過度閱讀ProtoReader
Deserialize
Stream
ProtoReader
選項 3,同樣是 protobuf-net:使用 API 進行序列化和反序列化*WithLengthPrefix
請注意,任何選項都假定您的代碼可以可靠地確定長度,這通常應(yīng)該在您使用的任何“框架”方法中單獨傳達(dá)。選項3在內(nèi)部處理這個問題,但在許多情況下,你自己的代碼仍然需要幀感知,這樣你就不會消耗太多,并閱讀I到下一條消息(除非這是UDP,每個數(shù)據(jù)包只有一幀,但是......它不是,因為)。您還需要考慮如果負(fù)載大于預(yù)期的緩沖區(qū)大小會發(fā)生什么情況。MemoryMappedFile
最簡單的“成幀”方法是在每個邏輯塊的開頭保留4個字節(jié);從偏移量 4 開始進行序列化,然后在偏移量 0 到 3 處使用固定的 4 字節(jié)布局(通常為“小”)寫回偏移量 0 到 3 處寫入的字節(jié)數(shù)。讀取時:讀取前4個字節(jié)以獲取長度,然后從段消耗該字節(jié)數(shù)。這本質(zhì)上是內(nèi)部功能,除了支持一些不同的布局選項。*WithLengthPrefix
- 1 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報