Структурировать в его представление 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>(...)
чтобы получить диапазон байтов.