Структурировать в его представление ReadOnlyMemory<byte>

У меня есть следующая структура:

[StructLayout(LayoutKind.Sequential)]
struct Message
{
     int Header;
     int Data;
}

и я хочу отправить его по проводам, без выделения ресурсов (используя SendAsync(ReadOnlyMemory<byte>)) вызов.

Как я могу получить Memory<byte> из данной структуры?

Я закончил тем, что Span<byte>, а затем застрял.

var message = new Message {
  Header = 1, Data = 3
};
var bytes = MemoryMarshal.AsBytes(
    MemoryMarshal.CreateReadOnlySpan(ref message, 1)
);

Есть ли способ, как поместить структуру непосредственно в поток без каких-либо выделений?

Я на netcoreapp2.1,

1 ответ

Что-то вроде:

Span<Message> valSpan = stackalloc Message[1];
valSpan[0] = new Message { Header = 123, Data = 456 };
Span<byte> bytes = MemoryMarshal.Cast<Message, byte>(valSpan); // has length 8

Обратите внимание, я использую Span<T> Вот. Вы можете сделать в основном то же самое с Memory<T> если нужно - но вам нужен резервный массив или аналогичный, который обычно требует выделения - если не массива, то пользовательского MemoryManager<T>:

var arr = new Message[1];
arr[0] = new Message { Header = 123, Data = 456 };
Memory<byte> bytes = MemoryMarshal.Cast<Message, byte>(arr); // has length 8

По сути, вы очень близки здесь:

MemoryMarshal.CreateReadOnlySpan(ref message, 1)

Хитрость, однако, заключается в использовании MemoryMarshal.Cast<TFrom, byte>(...) чтобы получить диапазон байтов.

Другие вопросы по тегам