首页 > 解决方案 > 结构为 ReadOnlyMemory表示

问题描述

我有以下结构:

[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

标签: c#.net-coresystem.memory

解决方案


就像是:

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>(...)获取一个字节跨度。


推荐阅读