在我的序列化器/反序列化器中,我有以下代码片段:
if (element_type.IsValueType && collection_type.IsArray)
{
try
{
GCHandle h = GCHandle.Alloc(array_object, GCHandleType.Pinned);
int arrayDataSize = Marshal.SizeOf(element_type) * c.Count;
var array_data = new byte[arrayDataSize];
Marshal.Copy(h.AddrOfPinnedObject(), array_data, 0, arrayDataSize);
h.Free();
WriteByteArray(array_data);
return;
}
catch (ArgumentException)
{
//if the value type is not blittable, then we need to serialise each array item one at a time
}
}
该方法的目的是尝试以最高效的方式(即仅作为一堆字节的内容)将值类型数组写入流中。
问题出现在类型是值类型但不可平坦化时,Alloc() 就会失败。目前,捕获异常并将控制传递给处理数组的代码,就好像它由引用类型组成。
然而,这种检查(由于抛出和捕获异常非常缓慢)由于应用程序中遇到的值类型数量众多,正在证明是一个严重的瓶颈。因此,我想知道检查类型是否可平坦化的最快方法是什么?