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
'Programing' 카테고리의 다른 글
요인 수준과 요인 레이블 간의 혼동 (0) | 2020.09.01 |
---|---|
Git rebase-모든 병합 충돌이 해결 된 경우에도 계속 불평 (0) | 2020.09.01 |
한 단어 만 포함하고 다른 단어는 포함하지 않는 문자열에 대한 정규식 (0) | 2020.09.01 |
FacebookSdk.sdkInitialize (컨텍스트)는 더 이상 사용되지 않습니다. (0) | 2020.09.01 |
참조로 shared_ptr을 전달해야합니까? (0) | 2020.09.01 |