给定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,它无法编译。
5条答案
按热度按时间pftdvrlh1#
你不能把一个只读的东西放到一个类型为
byte[]
的插槽中,因为byte[]
是可写的,这会破坏它的目的。它看起来像RabbitMQ changed their API in February,可能忘记更新示例代码了。一个快速的解决方法是使用
.ToArray()
:字符串
编辑:既然这被接受了,我将用Dmitry和zenseb提出的更好的解决方案来修改它,即使用
.Span
:型
v2g6jxz62#
使用Span property将消息转换为字符串,而无需额外的内存分配
字符串
z31licg03#
您需要使用
Span
属性。字符串
Encoding.UTF8.GetString
有一个ReadOnlySpan<byte>
的重载。你可以在这里阅读更多kg7wmglp4#
我更新了RabbitMQ.Client包,在我的Consumer_Received方法中遇到了同样的问题:
字符串
我检查了
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());
个wqnecbli5#
我遇到了同样的问题,并使用以下方法解决-
字符串