簡體   English   中英

Protobuf-net序列化/反序列化C#與Linux C ++

[英]Protobuf-net sirialization/deserialization c# vs Linux c++

我正在通過TCP套接字在Windows C#客戶端和Linux C ++服務器之間傳遞消息。 C#代碼使用protobuf-net v2(Linux Google的protobuf版本)。 我通過的小型測試對象有6個字段(Enum,Int,String)。 我需要兩個問題的幫助:

  1. 除非使用構造函數中的二進制數組初始化用作數據存儲的Memory流,否則C#部分無法反序列化從Linux發送的數據。 數組不能大於從Linux發送的數據(在我的情況下為9個字節)。 代碼示例-byte [] data = new byte [9],將數據從套接字復制到數組中。 MemoryStream myStream =新的MemoryStream(數據),將myStream傳遞給Serializer.Deserialize ...如果我初始化沒有Streaming緩沖區或1024字節數組的MemoryStream,則Deserialize將創建一個空對象,而不處理數據。

  2. 當我嘗試使用與C#中的Linux相同的值序列化相同的對象時,數據大小為11個字節,而Linux上為9個字節。 我在調試器中檢查了字節數組,C#版本具有與數組索引2-11中的Linux數據相同的9個字段。 索引0是8,索引1是9。我可以嘗試通過修改Linux反序列化代碼來解決該問題,只是需要知道,如果我始終必須在消息開頭處理兩個額外的字段。 另外,如果要解決C#中的反序列化問題,我可以在Linux上生成的消息中添加兩個額外的字段,只需要知道如何為這兩個字段生成值即可。

謝謝。 亞歷克斯。

  1. 簡單來說,Protobuf數據不會自我終止。 但是,您可以創建MemoryStreamProtoReader ,后者需要較大的有效負載,但僅限於虛擬長度。 如果要發送多個消息,則需要知道有效負載的長度-這是不可避免的。 這通常是通過長度前綴來實現的。 我希望這會引發隨機錯誤-最有可能是“無效的字段標題0”-並且我想知道您是否正在吞下該異常
  2. 沒有具體的例子就無法發表評論; 最有可能與字段號1的默認值有關(標題8 ===“字段1 varint”)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM