簡體   English   中英

Azure ServiceBus 消息序列化/反序列化

[英]Azure ServiceBus Message Serialization/Deserialization

我正在使用 .NET Core 應用程序通過 Azure 服務總線隊列發送對象,並讓 Web 作業(.NET Core 也是如此)接收它。

我的問題是如何序列化/反序列化以發送/接收對象?

我發現很多對舊版BroakerMessage.GetBody()的引用來接收消息,但沒有引用新的 .NET Core 方法。 請指教,謝謝。

發件人代碼:

using Microsoft.Azure.ServiceBus;

MyClass object = new MyClass();
var message = new Message(object);
await queueClient.SendAsync(message);

接收器代碼:

using Microsoft.Azure.ServiceBus;

public void ProcessQueueMessage([ServiceBusTrigger("queue")] Message message, TextWriter log)
{
}

可以使用 JSON 序列化來傳輸這些對象/實體。

假設以下類是將向 Azure 服務總線隊列發送/從 Azure 服務總線隊列接收的對象實例的類型:

public class Customer{ public string Name { get; set; } public string Email { get; set; } }

- - 發送 - -

在下面找到發送客戶對象實例的示例代碼(.NET Core 2.0 控制台應用程序):

QueueClient queueClient = new QueueClient(connectionString, queueName);
string messageBody = JsonConvert.SerializeObject(obj);
Message message = new Message(Encoding.UTF8.GetBytes(messageBody))
{
    SessionId = sessionId
};
await queueClient.SendAsync(message);

- - 收到 - -

在下面查找 Azure 函數(服務總線隊列觸發器/.NET Standard 2.0)示例代碼以接收消息並對其進行反序列化:

[FunctionName("ServiceBusQueueFunction")]
public static void Run([ServiceBusTrigger("taskqueue", Connection = "ServiceBusConnectionString")] Message message, TraceWriter log)
{
    Customer customer = JsonConvert.DeserializeObject<Customer>(Encoding.UTF8.GetString(message.Body));
}

以下 NuGet 包用於/測試上述示例:

  • Microsoft.Azure.ServiceBus(版本 3.0.2)。
  • Newtonsoft.Json(版本 11.0.2)。

考慮閱讀:在 JSON.NET 的性能提示文章下方找到: https ://www.newtonsoft.com/json/help/html/Performance.htm


設計原理:在最新的 Microsoft.Azure.ServiceBus 中刪除了內置 POCO 序列化支持。 這是因為“雖然這種隱藏的序列化魔法很方便,但應用程序應該顯式控制對象序列化並將它們的對象圖轉換為流,然后再將它們包含到消息中,並在接收方執行相反的操作。這會產生可互操作的結果。”

https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messages-payloads

如何序列化/反序列化以發送/接收對象?

請參考demo代碼吹:

發信息:

var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(obj));
await  queueClient.SendAsync(new Message { Body = body, ContentType = "text/plain" });

在.net核心WebJob中

var body = Encoding.UTF8.GetString(message.Body);
var obj = JsonConvert.DeserializeObject<T>(body);

測試結果:

在此處輸入圖片說明

這些都不適合我,因為:

當我們嘗試將消息正文解析為 JSON 時出現異常,因為我們接收的消息正文是

"@\u0006string\b3http://schemas.microsoft.com/2003/10/Serialization/?\u000b{ \"a\": \"1\"}"

這是因為“代理消息通過使用帶有二進制 XmlDictionaryWriter 的 DataContractSerializer 從給定對象初始化 BrokeredMessage 類的新實例”。

參考: https : //www.bfcamara.com/post/84113031238/send-a-message-to-an-azure-service-bus-queue-with

所以我改用這篇博文: https : //abhishekrlal.com/2012/03/30/formatting-the-content-for-service-bus-messages/

示例 1:使用字符串

使用字符串和默認(DataContract + Binary)序列化程序創建 BrokeredMessage 時:

BrokeredMessage stringDefaultMessage = new BrokeredMessage("default string");

您可以通過以下方式接收此消息:

string s = receiveMessage.GetBody<string>();

我也遇到了這個要求,並制作了一個簡單的序列化/反序列化庫來包裝這個功能。 你可以在這里找到它 ,它可能有助於實現其他任何人遇到這個。

暫無
暫無

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

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