C# Преобразование ReadOnlyMemory <byte>в байт [] - PullRequest
4 голосов
/ 22 апреля 2020

Учитывая 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

enter image description here

Что забавно, потому что я буквально копирую пример Hello World основного продукта под названием RabbitMQ , и он не компилируется.

Ответы [ 4 ]

6 голосов
/ 22 апреля 2020

Вы не можете поместить вещь, предназначенную только для чтения, в слот с типом byte[], потому что byte[] s доступны для записи, и это может нанести ущерб цели. Похоже, что RabbitMQ изменил свой API в феврале и, возможно, забыл обновить пример кода.

Быстрый обходной путь - использовать .ToArray():

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

Редактировать : Поскольку это было принято, я дополню его лучшим решением, предложенным Дмитрием и Зенсебом, которое должно использовать .Span:

var body = ea.Body.Span;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
3 голосов
/ 22 апреля 2020

Используйте Свойство Span для преобразования сообщения в строку без выделения дополнительной памяти

var body = ea.Body; //ea.Body is of Type ReadOnlyMemory<byte>
var message = Encoding.UTF8.GetString(body.Span);
Console.WriteLine(" [x] Received {0}", message);
2 голосов
/ 23 апреля 2020

Вам необходимо использовать свойство 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. Вы можете прочитать больше здесь

0 голосов
/ 25 апреля 2020

Я обновил пакет RabbitMQ.Client, и у меня возникла та же проблема с моим методом Consumer_Received:

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

Я проверил BasicDeliverEventArgs и увидел, что Body теперь является типом ReadOnlyMemory:
public ReadOnlyMemory<byte> Body { get; set; }

Как сказал Джефф, RabbitMQ изменил свой API , поэтому я думаю, что это изменилось по сравнению с предыдущими уроками, которые у нас были на inte rnet.

Чтобы исправить, я только пришлось преобразовать мое тело сообщения в массив (в метод Consumer_Received):
var message = Encoding.UTF8.GetString(e.Body.ToArray());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...