![](/img/trans.png)
[英]C# Protobuf-net: how do I deserialize consecutively from a network stream?
[英]How do I deserialize a binary AMQP message received with protobuf-net?
我正在學習 C# 並將其與 Godot 一起使用。 我們正在嘗試通過 AMQP 從客戶端發送二進制 Protobuf 編碼的消息,並使用在 Godot 中運行的 C# 腳本接收它。
我正處於收到消息的位置,我正在嘗試反序列化它。 消息正文是一個 44 字節的數組,但 protobuf.net 反序列化不采用字節數組。 消息正文是object
類型,但它肯定包含一個字節數組。
byte[] binaryBody = (byte[])message.Body;
CommandBuffer commandBuffer;
commandBuffer = Serializer.Deserialize<CommandBuffer>(binaryBody);
這會導致錯誤:
The call is ambiguous between the following methods or properties: 'Serializer.Deserialize<T>(ReadOnlyMemory<byte>, T, object)' and 'Serializer.Deserialize<T>(ReadOnlySpan<byte>, T, object)' [srt-godot-test]csharp(CS0121)
嘗試將binaryBody
轉換為MemoryStream
會導致各種混亂和無法正確解碼的 protobuf:
MemoryStream st = new MemoryStream();
st.Write(binaryBody, 0, binaryBody.Length);
似乎我應該能夠以某種方式反序列binaryBody
,但我不知道該怎么做。
我發現這篇文章: Protobuf.net Serialize/Deserialize to/from byte arrays
這將我帶到MemoryStream
頁面: https://learn.microsoft.com/en-us/do.net/api/system.io.memorystream.-ctor?redirectedfrom=MSDN&view.net-6.0#System_IO_MemoryStream__ctor_System_Byte__ _
這導致了這段代碼:
void GameEventReceived(IReceiverLink receiver, Message message)
{
GD.Print("Event received!");
// accept the message so that it gets removed from the queue
receiver.Accept(message);
byte[] binaryBody = (byte[])message.Body;
MemoryStream st = new MemoryStream(binaryBody, false);
// prep a command buffer for processing the message
CommandBuffer commandBuffer;
commandBuffer = Serializer.Deserialize<CommandBuffer>(st);
}
關鍵是直接從字節串創建MemoryStream
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.