【问题标题】:Read binary data from UDP to model从 UDP 读取二进制数据到模型
【发布时间】:2021-10-06 19:55:40
【问题描述】:

在我的应用程序中,我通过 UDP 接收二进制数据,我编写了一个二进制读取器,它逐字段读取并读取适当的类型并将其手动分配给模型。有没有一种方法来定义模型,告诉某种(反)序列化程序在哪里寻找某个字段而不是分配所有内容?

某些字段可能是数组 - 它们的大小是已知且固定的,但模型不知道这一点。

示例(当前代码):

byte Field1 = binaryReader.ReadByte();
sbyte Field2 = binaryReader.ReadSByte();
float[] Field3 = ...
//etc.

所需代码:

public class Model
{
   [BinaryPosition(1)]
   public byte Field1 { get; set;}
   [BinaryPosition(2)]
   public sbyte Field2 { get; set; }
   [BinaryPosition(3)]
   public float[] Field3 { get; set; }
}
//...
var model = BinaryDeserializer.Deserialize<Model>(byteBuffer);

【问题讨论】:

    标签: c# .net .net-core


    【解决方案1】:

    有很多方法可以做到这一点,成本和复杂性会随着您需要的功能越多而增加。

    从最简单的 POCO struct 开始,正如 POCO 所暗示的那样,它适用于普通 C 类型(byteint,基本上是 unmanaged 值类型,没有 string 或任何东西)。在您的示例中,这将是:

    struct Model
    {
        public byte Field1;
        public sbyte Field2;
    }
    

    有很多方法可以将您的 byte[] 数组转换为该结构,按照效率(和 .Net 版本)的顺序排列:MemoryMarshal.Castfixed+pointers 和 Marshal.PtrToStructure

    如果你需要像字符串这样更复杂的对象,你需要使用MarshalAs属性来声明你想要如何打包字符串,通常作为一个值数组或者不太典型作为一个指针,然后你需要使用@ 987654332@ 让编组器默默地为您处理所有额外的副本。显然,效率要低得多。

    【讨论】:

    • 我没有字符串,但我有数组,我也更新了问题
    • 只要是 C 风格的数组,即具有恒定大小,数组就可以了。您可以使用 fixed 数组关键字来拥有就地值数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2021-12-24
    • 2011-11-27
    • 1970-01-01
    • 2017-06-15
    • 2010-09-14
    • 1970-01-01
    相关资源
    最近更新 更多