1

최근에 Reflection.Emit을 배우기 시작 했으므로 코드에서 더 나은 성능을 위해 모든 Activator 사용을 대체 할 수있었습니다. 나는 현재 일종의 직렬화 및 비 직렬화 라이브러리에 대해 생각하고있다. 특히 deserialization을 위해 나는 serialization 이전에했던 것과 똑같이 객체의 상태를 다시 만들고 싶습니다. (serialization은 100 % 올바른 것으로 가정합니다.) 그러나, 예를 들면. 이 객체에는 복잡한 논리가 있고 특정 방식으로 초기화되어야하기 때문에 여러 생성자가있는 클래스가있을 수 있으며 모든 객체는 정교합니다. 그러나 객체에 대한 모든 것을 직렬화 할 때 내가 할 수있는 가장 간단한 방법은 제공된 ctors를 무시하는 것입니다. 빈 객체를 만들고 모든 필드를 데이터로 채 웁니다. 기간.Reflection.Emit를 통해 생성자없이 인스턴스를 생성하십시오 - 가능합니까?

OpCodes.NewobjILGenerator.Emit에 사용하면 매개 변수로 ConstructorInfo을 전달해야합니다. 구조체의 경우에는 항상 기본 매개 변수없는 ctor를 사용하기 때문에 쉽습니다. 그러나 수업에서는 상황이 다릅니다.

어떤 도움을 주셔서 감사합니다.

+1

'BinaryFormatter'가 생성자를 호출하지 않고 객체를 만들기 때문에 가능해야합니다. – usr

답변

3

BinaryFormatter는 생성자를 호출하지 않고 개체를 만들기 때문에 가능해야합니다.

FormatterServices.GetSafeUninitializedObject을 사용할 수 있습니다. 이것은 아마도 가장 높은 보안 요구 사항에 의해 보호됩니다.

+0

고마워, 잘 작동하지만 거의 100us 정도 지속된다. 하지만 이제 Reflector를 사용하여 내부를 살펴보고 더 많은 성능을 얻을 수 있습니다. – Sushi271

+0

무언가를 찾으면 알려주세요. – usr

+0

사실 나는 몇 가지를 찾았습니다. 1. 내부에는 extern이므로 실제로는 블랙 박스 인 메소드 nativeGetUninitializedObject가 있습니다. 내가 그것에 대해 뭔가를 찾았 : http://stackoverflow.com/questions/4866179/where-does-nativegetuninitializedobject-actually-exist 그러나 그것은별로, : 2. 나는 더 많은 성능 검사를했는데 그것은 GetSafeUninitializedObject 예쁜 것 같습니다 비결정론. Runned는 실제로는 100us 정도 지속되었지만 1000 회 이상 실행 된 경우에는 몇 번의 Ticks 만 남았습니다. 약 10000 ~ 2 회의 Ticks (예 : 200ns 미만) 만 지속되었습니다. – Sushi271