【发布时间】:2012-05-21 10:11:37
【问题描述】:
在我的序列化器/反序列化器中,我有以下 sn-p:
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 的最快方法是什么?
【问题讨论】:
-
我遇到了同样的问题,我最终缓存了每种类型的结果(例如在静态字典中)。检查与此处相同,try/catch。
标签: c# serialization marshalling value-type blit