我在一些结构和他们的byte[]
表示之间做了一些转换。我找到了两种方法,但差异(性能,记忆和......)对我来说并不清楚。
方法1:
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;
}
方法2:
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);
}
}
哪一个更好,主要区别是什么?
答案 0 :(得分:2)
您正在谈论两种不同的方法和两种不同类型的数据。如果您正在使用转换为字节数组的原始值,请转到第一种方法。如果要处理序列化为字节数组的值(它们还包含序列化数据),请转到第二种方法。两种不同的情况,两种不同的方法......它们不是,让我说,“同义词”。
Int32 Serialized into Byte[] -> Length 54
Int32 Converted to Byte[] -> Length 4
答案 1 :(得分:1)
使用BinaryFormatter
序列化数据时,它会在输出流中附加元数据,以便在反序列化期间使用。因此,对于您拥有的两个示例,您会发现在给定相同T
输入的情况下它不会生成相同的byte[]
输出。因此,您需要决定是否关心二进制输出中的元数据。如果你不在乎,方法2显然更清洁。如果你需要它是直接二进制,那么你将不得不使用方法1。