2010-09-16 112 views
1

我有一個使用protobuf發送消息的java後端,它通過tib在一個大字節數組blob中發送定界消息對象。我可以在java中使用函數parseDelimitedFrom(yourStreamHere)反序列化它們,但在C#端我們遇到了一些問題,但找不到任何示例,但我可能只是在此處丟失了一些明顯的東西。使用protobuf-net反序列化消息列表

我們正在做的在C#這樣的事情

using (MemoryStream mem = new MemoryStream()) 
{ 
    mem.Write(byteArray, 0, byteArray.Length); 
    mem.Position = 0;  
    return Serializer.Deserialize<List<OrderState>>(mem); 
} 

注:我看到這個舊的post,但它看起來相當過時,我認爲已經發生了變化,以protobuf網從那時起,但正確的,如果我錯了有

+0

順便說一句,使用MemoryStream效率不高。你可以簡單地使用'new MemoryStream(byteArray)'將你的字節數組包裝在MemoryStream中,而不是用一個新的內部字節數組創建一個MemoryStream並將你的字節數組複製到它中。 – dtb 2010-09-16 14:00:06

+0

我認爲差別不大,因爲MemoryStream會在內部做這樣的事情,它只是一些示例代碼,您是否對這個問題有任何洞見? – jtruelove 2010-09-16 14:42:38

+0

我不知道我的頭頂形成parsedelimited使用。我現在不在電腦上,但應該可以稍後再看。 – 2010-09-16 14:59:08

回答

1

昨天用標記0和前綴樣式128在一個點上開發,像這樣

IEnumerable<SomeObject> list = (Serializer.DeserializeItems<SomeObject>(memoryStream, PrefixStyle.Base128, 0)); 

但我們仍然得到了錯誤。當我們今天在C#端調用getProto時,它似乎將我們設置爲double類型的屬性轉換爲fixed64類型,在我們指定的java一側是double,所以我認爲這種不匹配導致了我們看到的錯誤。我們暫時將這些字段更改爲字符串類型,現在上面的代碼片段起作用。當然,理想情況下,我們不想在不需要時發送字符串。

+0

>將我們的屬性設置爲double類型轉換爲fixed64類型 - 你的意思是WH生成一個.proto?或在電線上?最近對.proto一代進行了修復,但這並沒有改變實際的序列化。 – 2010-09-16 19:17:20

+0

我相信當在C#端生成.proto時,但是當來自java服務的請求進來時,它給我們一個異常可能是因爲傳入的請求使用了double,但是C#定義有一個fixed64,或者你是說這不會發生? – jtruelove 2010-09-17 13:33:37

+0

什麼令人困惑(對我而言)是線上都使用相同的格式。這只是GetProto受到影響,所以我很困惑... – 2010-09-22 05:39:11