Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 通过Reflection.Emit创建没有构造函数的实例-可能吗?_Performance_Reflection_Constructor_Instance_Reflection.emit - Fatal编程技术网

Performance 通过Reflection.Emit创建没有构造函数的实例-可能吗?

Performance 通过Reflection.Emit创建没有构造函数的实例-可能吗?,performance,reflection,constructor,instance,reflection.emit,Performance,Reflection,Constructor,Instance,Reflection.emit,我最近开始学习Reflection.Emit,这样我就可以在代码中替换所有激活器的用法,以获得更好的性能。我目前正在考虑某种序列化和反序列化库。特别是对于反序列化,我希望重新创建与序列化之前完全相同的对象状态(我假设序列化是100%正确的)。然而,例如,可以有一个类,它有多个构造函数,每个构造函数都做一些复杂的事情,因为这个对象有复杂的逻辑,必须以某种特定的方式初始化。但是,当我序列化了关于对象的所有内容后,我能做的最简单的事情就是以某种方式绕过任何提供的构造函数——只需创建一个空对象并用数据填

我最近开始学习Reflection.Emit,这样我就可以在代码中替换所有激活器的用法,以获得更好的性能。我目前正在考虑某种序列化和反序列化库。特别是对于反序列化,我希望重新创建与序列化之前完全相同的对象状态(我假设序列化是100%正确的)。然而,例如,可以有一个类,它有多个构造函数,每个构造函数都做一些复杂的事情,因为这个对象有复杂的逻辑,必须以某种特定的方式初始化。但是,当我序列化了关于对象的所有内容后,我能做的最简单的事情就是以某种方式绕过任何提供的构造函数——只需创建一个空对象并用数据填充它的所有字段。句号

不幸的是,在
ILGenerator.Emit
中使用
OpCodes.Newobj
需要传递
ConstructorInfo
作为参数。对于结构,这将很容易,因为它们总是有默认的无参数的ctor。然而,在课堂上,情况就不同了


我将非常感谢您的帮助。

这必须是可能的,因为BinaryFormatter在不调用构造函数的情况下创建对象


您可以使用
FormatterServices.GetSafeUninitializedObject
。这可能受到最高安全要求的保护。

这必须是可能的,因为
BinaryFormatter
在不调用构造函数的情况下创建对象。谢谢,它工作得很好,尽管它可以持续大约100秒,这相当多。但现在我可以使用反射器查看内部,也许我可以获得更高的性能:)如果您确实发现了一些东西,请告诉我。事实上,我确实发现了一些东西:1。里面有一个名为nativeGetUninitializedObject的方法,它实际上是一个黑盒,因为它是extern。我在这里找到了一些关于它的东西:但是并不多:2。我做了更多的性能检查,似乎GetSafeUninitializedObject是相当不确定的。Runned曾经持续了大约100秒,但当它运行超过1000次时,它只持续了几次滴答声,大约10000次甚至更多——不到2次滴答声(即不到200纳秒)。很难相信它会如此缓慢。它是序列化基础结构的关键部分。如果速度较慢,它将显示在分析器结果上并进行优化。序列化在10年前是一项关键技术。您可以尝试RuntimeTypeHandle.Allocate,它是私有的。使用delegate.CreateDelegate创建访问者委托。我在reflectioninvocation.cpp中找到了它。