Programing

DataContractSerializer가 내 생성자를 호출하지 않습니까?

lottogame 2020. 9. 1. 07:56
반응형

DataContractSerializer가 내 생성자를 호출하지 않습니까?


나는 완전히 불가능하다고 생각하는 미친 것을 깨달았습니다. 객체를 deserialize 할 때 DataContractSerializer는 생성자를 호출하지 않습니다 !

예를 들어이 클래스를 가져 가십시오.

[DataContract]
public class Book
{
    public Book()
    { // breakpoint here
    }

    [DataMember(Order = 0)]
    public string Title { get; set; }
    [DataMember(Order = 1)]
    public string Author { get; set; }
    [DataMember(Order = 2)]
    public string Summary { get; set; }
}

해당 클래스의 개체를 역 직렬화 할 때 중단 점이 적중되지 않습니다. 이 개체의 유일한 생성자이기 때문에 어떻게 가능한지 전혀 모릅니다!

DataContract속성 때문에 컴파일러에서 추가 생성자가 생성되었다고 가정 했지만 리플렉션을 통해 찾을 수 없었습니다.

그래서, 내가 알고 싶은 것은 이것입니다 : 생성자가 호출되지 않고 어떻게 내 클래스의 인스턴스를 만들 수 있습니까?

참고 : OnDeserializing역 직렬화가 시작될 때 특성을 사용하여 개체를 초기화 할 수 있다는 것을 알고 있습니다 . 이것은 제 질문의 주제가 아닙니다.


DataContractSerializer(같은 BinaryFormatter)를 사용하지 않는 모든 생성자를. 빈 메모리로 객체를 생성합니다.

예를 들면 :

    Type type = typeof(Customer);
    object obj = System.Runtime.Serialization.
        FormatterServices.GetUninitializedObject(type);

역 직렬화 프로세스 (또는 필요한 경우 콜백)가이를 완전히 초기화한다고 가정합니다.


이 동작 없이는 불가능한 시나리오가 있습니다. 다음을 생각해보십시오.

1) 새 인스턴스를 "초기화"상태로 설정하는 하나의 생성자가있는 개체가 있습니다. 그런 다음 해당 인스턴스에서 일부 메서드가 호출되어 "처리됨"상태가됩니다. "처리됨"상태의 새 객체를 생성하고 싶지 않지만 인스턴스를 직렬화 / 비 직렬화하고 싶습니다.

2) 허용되는 생성자 매개 변수의 작은 집합을 제어하기 위해 개인 생성자와 일부 정적 속성이있는 클래스를 만들었습니다. 이제 여전히 직렬화 / 비 직렬화 할 수 있습니다.

XmlSerializer에 예상 한 동작이 있습니다. 기본 생성자가 필요하기 때문에 XmlSerializer에 몇 가지 문제가 있습니다. 이와 관련하여 때로는 개인 속성 설정자를 갖는 것이 합리적입니다. 그러나 XmlSerializer는 직렬화 / 역 직렬화하기 위해 속성에 대한 공용 getter 및 setter도 필요합니다.

직렬화 중에 인스턴스 상태를 일시 중단하고 역 직렬화 중에 다시 시작하는 것과 같은 DataContractSerializer / BinaryFormatter 동작을 생각합니다. 즉, 인스턴스는 "구성"되지 않고 이전 상태로 "복원"됩니다.

이미 언급했듯이 [OnDeserializing] 속성을 사용하면 직렬화되지 않은 데이터를 동기화 상태로 유지할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/1076730/datacontractserializer-doesnt-call-my-constructor

반응형