从字节数组读取任意类型的值

时间:2014-06-10 11:13:36

标签: c# serialization types memorystream binaryformatter

我必须从存储在字节数组中某个给定偏移处的字节创建任意值类型的实例(例如,如果type为int,则应采用4个字节)。我知道我可以使用指向固定对象的指针轻松完成,但我不想拥有unsafe代码。所以我尝试以下代码(完整性检查被剥离):

public object GetValueByType(System.Type type, byte[] byteArray, int offset)
{
    int size = System.Runtime.InteropServices.Marshal.SizeOf(type);
    MemoryStream memoryStream = new MemoryStream();
    memoryStream.Write(byteArray, offset, size);
    memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    object obj = (object)binaryFormatter.Deserialize(memoryStream);
    return obj;
}

但是此代码在binaryFormatter.Deserialize处断开。

我如何修复上述代码(或以其他任何方式实现相同目的)?

1 个答案:

答案 0 :(得分:1)

最终找到了解决方案here(请参阅答案50),这是为方便起见的最终代码:

    public object GetValueByType(Type typeOfReturnedValue, int offsetInDataSection)
    {
        GCHandle handle = GCHandle.Alloc(this.byteArray, GCHandleType.Pinned);
        int offset = <some desired offset>;
        IntPtr addressInPinnedObject = (handle.AddrOfPinnedObject() + offset);
        object returnedObject = Marshal.PtrToStructure(addressInPinnedObject, typeOfReturnedValue);
        handle.Free();
        return returnedObject;
    }

这样我的代码仍然没有任何不安全的代码。不是很棒吗?!