XML 직렬화 가능 클래스에 매개 변수가없는 생성자가 필요한 이유
Xml 직렬화를 수행하는 코드를 작성 중입니다. 아래 기능으로.
public static string SerializeToXml(object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, obj);
return writer.ToString();
}
}
인수가 매개 변수가없는 생성자가없는 클래스의 인스턴스 인 경우 예외가 발생합니다.
처리되지 않은 예외 : System.InvalidOperationException : CSharpConsole.Foo에는 매개 변수가없는 생성자가 없으므로 직렬화 할 수 없습니다. System.Xml.Serialization.ModelScope.GetTypeModel (System.Xml.Serialization.ModelScope.GetTypeModel (System.Xml.Serialization.TypeScope.GetTypeDesc (Type type, MemberInfo sour e, Boolean directReference, Boolean throwOnError))에서 System.Xml.Serialization.ModelScope.GetTypeModel (Type type, System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (Type type, XmlRootAttribute root, String defaultNamespace)의 System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (부울 직접 참조)에서 System.Xml.Serialization의 System.Xml.Serialization.XmlSerializer..ctor (Type type, String defaultName space)입니다. XmlSerializer..ctor (유형)
XML 직렬화가 성공하려면 왜 매개 변수가없는 생성자가 있어야합니까?
편집 : cfeduke의 답변에 감사드립니다. 매개 변수가없는 생성자는 개인용 또는 내부 용일 수 있습니다.
객체의 역 직렬화 과정에서 객체의 역 직렬화를 담당하는 클래스는 직렬화 된 클래스의 인스턴스를 만든 다음 인스턴스를 채운 후에 만 직렬화 된 필드와 속성을 채 웁니다.
매개 변수가없는 한 생성자를 만들 private
거나 internal
원하는 경우 만들 수 있습니다 .
의 제한 사항입니다 XmlSerializer
. 주의 BinaryFormatter
와 DataContractSerializer
하지 않는 그들이 에테르에서 초기화되지 않은 개체를 만들고 직렬화 복원시를 초기화 할 수 있습니다 -이 필요합니다.
xml을 사용 DataContractSerializer
하고 있으므로 클래스를 사용 하고 [DataContract]
/ [DataMember
]로 표시하는 것을 고려할 수 있지만 이것이 스키마를 변경한다는 점에 유의하십시오 (예를 들어, [XmlAttribute]
모든 것이 요소가 됨).
업데이트 : 정말로 알고 싶다면 생성자를 호출하지 않고 객체를 만드는 데 BinaryFormatter
사용 FormatterServices.GetUninitializedObject()
합니다. 아마 위험하다; 너무 자주 사용하지 않는 것이 좋습니다 ;-p MSDN에 대한 설명도 참조하십시오.
객체의 새 인스턴스가 0으로 초기화되고 생성자가 실행되지 않기 때문에 객체가 해당 객체에 유효한 것으로 간주되는 상태를 나타내지 않을 수 있습니다. 현재 방법은 사용자가 모든 필드를 즉시 채우려는 경우 역 직렬화에만 사용해야합니다. 변경 불가능한 유형의 빈 인스턴스를 작성하는 것은 아무 목적이 없기 때문에 초기화되지 않은 문자열을 작성하지 않습니다.
나 자신의 직렬화 엔진을 가지고 있지만 그것을 사용하려고하지 않습니다 FormatterServices
. 생성자 ( 모든 생성자)가 실제로 실행 되었음을 알고 싶습니다 .
우선, 이것은 documentation에 쓰여진 것입니다 . 나는 그것이 주요한 분야가 아니라 당신의 계급 분야 중 하나라고 생각합니다-그리고 deserialiser가 어떻게 매개 변수없는 구성없이 그것을 다시 구성하고 싶어합니까?
생성자를 비공개로 만드는 해결 방법이 있다고 생각합니다.
'Programming' 카테고리의 다른 글
ES6에서`export const`와`export default ' (0) | 2020.05.26 |
---|---|
gcc는 C 및 C ++ 헤더 파일을 어디에서 찾습니까? (0) | 2020.05.26 |
GitHub에서 리포지토리 설명을 어떻게 변경합니까? (0) | 2020.05.26 |
app.config에 서비스 삽입 (0) | 2020.05.26 |
getResourceAsStream () 대 FileInputStream (0) | 2020.05.26 |