rabbitmq C#将ReadOnlyMemory转换< byte>为byte[]

ercv8c1e  于 7个月前  发布在  RabbitMQ
关注(0)|答案(5)|浏览(146)

给定ReadOnlyMemory Struct,我想将流转换为字符串
我有以下代码:

var body = ea.Body; //ea.Body is of Type ReadOnlyMemory<byte>
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);

字符串
我使用的是最新的C#和.NET CORE 3.1


的数据
这很有趣,因为我实际上是复制粘贴Hello World示例of a major product called RabbitMQ,它无法编译。

pftdvrlh

pftdvrlh1#

你不能把一个只读的东西放到一个类型为byte[]的插槽中,因为byte[]是可写的,这会破坏它的目的。它看起来像RabbitMQ changed their API in February,可能忘记更新示例代码了。
一个快速的解决方法是使用.ToArray()

var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);

字符串
编辑:既然这被接受了,我将用Dmitry和zenseb提出的更好的解决方案来修改它,即使用.Span

var body = ea.Body.Span;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);

v2g6jxz6

v2g6jxz62#

使用Span property将消息转换为字符串,而无需额外的内存分配

var body = ea.Body; //ea.Body is of Type ReadOnlyMemory<byte>
var message = Encoding.UTF8.GetString(body.Span);
Console.WriteLine(" [x] Received {0}", message);

字符串

z31licg0

z31licg03#

您需要使用Span属性。

var data = new byte[] { 72, 101, 108, 108, 111 };
var body = new ReadOnlyMemory<byte>(data);
var text = Encoding.UTF8.GetString(body.Span);

Console.WriteLine(text);

字符串
Encoding.UTF8.GetString有一个ReadOnlySpan<byte>的重载。你可以在这里阅读更多

kg7wmglp

kg7wmglp4#

我更新了RabbitMQ.Client包,在我的Consumer_Received方法中遇到了同样的问题:

private static void Consumer_Received(object sender, BasicDeliverEventArgs e)
        // Code

字符串
我检查了BasicDeliverEventArgs,发现Body现在是ReadOnlyMemory类型:
public ReadOnlyMemory<byte> Body { get; set; }
正如Jeff所说,RabbitMQ changed their API,所以我认为这与我们在互联网上的以前的教程有所不同。
为了解决这个问题,我只需要将我的Body消息转换为一个Array(到Consumer_Received方法):
var message = Encoding.UTF8.GetString(e.Body.ToArray());

wqnecbli

wqnecbli5#

我遇到了同样的问题,并使用以下方法解决-

public override void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey, IBasicProperties properties, ReadOnlyMemory<byte> body) {
 var msg = body.ToArray();
 var message = Encoding.UTF8.GetString(msg);

字符串

相关问题