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