c# - 结构为 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
。
解决方案
就像是:
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>(...)
获取一个字节跨度。
推荐阅读
- linux - task_struct 中的 nivcsw 和 nvcsw 字段是什么?
- ios - Swift:struct no init 中的快速访问功能
- javascript - 懒惰的线条画家作为预加载器
- javascript - JS想要迭代嵌套对象中每个键的值并将其设置为空“”,并创建此类对象的数组
- c - 预期结构或联合
- ruby - 如何替换 DTD 路径 Nokogiri?
- c - 链接列表中的 void*
- sql-server - 通过函数调用时python插入sql不起作用
- reactjs - 将 Antd v3 升级到 v4 后显示来自 Antd 的任何组件时出现错误
- sql - 根据其他行中的值计算值