【问题标题】:Convert byte to enum by Marshalling IntPtr通过编组 IntPtr 将字节转换为枚举
【发布时间】:2019-08-06 13:27:40
【问题描述】:

我正在尝试将大小为 1 的字节数组转换为枚举:

public enum InformationMessageLevel : byte
{
    Information = 0,
    Warning = 1,
    Error = 2,
    Fatal = 3
}

使用编组:

   // bytes = byte[1] = 0
   // t is typeof(InformationMessageLevel)
unsafe
{
    fixed (byte* p = bytes)
    {
        var localPtr = p;

        return Marshal.PtrToStructure((IntPtr)localPtr, t);
    }
}

但我得到了错误:

"指定的结构必须是 blittable 或有布局 信息。\r\n参数名称:结构"

我使用 IntPtr 编组的原因是,此方法用于将数据动态反序列化为不同类型的属性。

【问题讨论】:

  • t 是什么?
  • InformationMessageLevel result = (InformationMessageLevel) bytes[0];?
  • 改用Marshal.ReadByte。此外,不要使用Marshal 对不会离开托管世界的数据进行序列化/反序列化。它不是为此而设计的,它旨在在托管和非托管之间进行编组。仅托管代码有更好的序列化解决方案——JSON、BitConverterBinaryFormatterprotobuf...不同的技术适用于不同的场景。 Marshal 几乎从来都不是正确的选择。
  • @DmitryBychenko 抱歉,发帖按钮应该更慢,更新问题的原因。
  • 你想要的是 InformationMessageLevel[] message = new InformationMessageLevel(size)。然后使用 Marshal.PtrToStructure()。

标签: c#


【解决方案1】:

不使用编组的动态解决方案:

byte[] bytes = { 0 };
var t = typeof(InformationMessageLevel);
var result = Enum.ToObject(t, bytes[0]);

Console.WriteLine(result);

输出:

Information

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多