簡體   English   中英

如何反序列化通過 protobuf.net 接收的二進制 AMQP 消息?

[英]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__ _

我注意到這個選項: https://learn.microsoft.com/en-us/do.net/api/system.io.memorystream.-ctor?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.

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