【问题标题】:difference of two methods for converting byte[] to structure in c#在c#中将字节[]转换为结构的两种方法的区别
【发布时间】:2026-01-15 16:55:02
【问题描述】:

我正在一些结构和它们的byte[] 表示之间进行一些转换。我找到了两种方法来做到这一点,但区别(性能、内存和......)对我来说并不清楚。

方法一:

public static T ByteArrayToStructure<T>(byte[] buffer)
{    
    int length = buffer.Length;
    IntPtr i = Marshal.AllocHGlobal(length);
    Marshal.Copy(buffer, 0, i, length);
    T result = (T)Marshal.PtrToStructure(i, typeof(T));
    Marshal.FreeHGlobal(i);
    return result;
}

方法二:

public static T Deserialize<T>(byte[] buffer)
{
    BinaryFormatter formatter = new BinaryFormatter();
    using (System.IO.MemoryStream stream = new System.IO.MemoryStream(buffer))
    {
        return (T)formatter.Deserialize(stream);
    }
}

那么哪个更好,主要区别是什么?

【问题讨论】:

  • 对它们都运行分析器。
  • 二进制格式化程序是否也不会将类型数据序列化到流中?
  • 就我而言,确实如此。所以如果他们没有区别,每个人都应该使用第二种方法,没有人使用第一种方法。

标签: c# marshalling binaryformatter binary-serialization


【解决方案1】:

您在谈论两种不同的方法和两种不同类型的数据。如果您正在使用转换为字节数组的原始值,请使用第一种方法。如果您正在处理序列化为字节数组的值(它们还包含序列化数据),请使用第二种方法。两种不同的情况,两种不同的方法……让我说,它们不是“同义词”。

Int32 Serialized into Byte[] -> Length 54
Int32 Converted to Byte[]    -> Length 4

【讨论】:

  • 很好的例子。在这种情况下,什么样的数据构成序列化数据?
【解决方案2】:

当使用BinaryFormatter 序列化您的数据时,它将在输出流中附加元数据以供反序列化期间使用。因此,对于您拥有的两个示例,您会发现在给定相同的byte[] 输入的情况下,它不会产生相同的T 输出。所以你需要决定你是否关心二进制输出中的元数据。如果您不在乎,方法2显然更清洁。如果你需要它是直接二进制,那么你将不得不使用类似方法 1 的东西。

【讨论】: