В моем сериализаторе/десериализаторе у меня есть следующий фрагмент:
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() дает сбой. В этот момент перехватывается исключение и управление передается коду, который имеет дело с массив, как если бы он состоял из ссылочных типов.
Однако эта проверка (из-за генерации и перехвата исключения, которое, как я понимаю, происходит очень медленно) оказывается серьезным узким местом из-за количества типов значений, встречающихся в мое приложение. Итак, мне интересно, какой самый быстрый способ проверить, является ли тип преобразовываемым?