En mi serializador/deserialiser, tengo el siguiente fragmento:¿La forma más rápida de verificar si un tipo es blittable?
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
}
}
El propósito de los cuales es tratar de escribir una gran variedad de tipos de valor a una corriente, de la manera más eficiente posible (es decir, justo el contenido como un grupo de bytes).
El problema aparece cuando el tipo es de un tipo de valor pero no es blittable, y Alloc() falla. En este momento, se captura la excepción y se pasa el control al código que trata con la matriz como si constara de tipos de referencia.
Sin embargo, este chequeo (debido a que arroja y atrapa la excepción que entiendo es muy lento) está demostrando ser un cuello de botella severo debido a la cantidad de tipos de valores que se encuentran en mi aplicación. Entonces me pregunto, , ¿cuál es la forma más rápida de verificar si un tipo es blittable?
Tuve el mismo problema, terminé con los resultados del almacenamiento en caché para cada tipo (por ejemplo, en el diccionario estático). La comprobación se hizo igual que aquí, intente/atrape. –