내 공용 속성이 XmlSerializer에 의해 직렬화되지 않는 이유는 무엇입니까?
이것은 내가 오랫동안 고민했기 때문에 어딘가에 문서화 할 것이라고 생각했습니다. (질문 및 답변에 대해 사과드립니다.)
(C # .net 2.0) XmlSerializer에 의해 직렬화되는 클래스가 있는데 새 공용 속성을 추가했지만 출력 XML에 포함되지 않았습니다.
내가 찾을 수있는 문서에서는 언급되지 않았지만 공용 속성에는 집합이 있어야하고 직렬화 할 수 있어야합니다! 직렬화하려는 경우 동일한 파일에서 역 직렬화하기를 원할 것이라고 가정하기 때문에 이것은 집합과 가져 오기가 모두있는 속성 만 직렬화하기 때문이라고 생각합니다.
언급했듯이 대부분의 속성에는 getter와 setter가 모두 있어야합니다. 이에 대한 주요 예외는 목록입니다. 예를 들면 다음과 같습니다.
private readonly List<Foo> bar = new List<Foo>();
public List<Foo> Bar {get { return bar; } } // works fine
잘 작동합니다. 그러나 setter를 XmlSerializer
찾으면 공개되어야합니다. 다음은 작동 하지 않습니다 .
public List<Foo> Bar {get; private set;} // FAIL
직렬화 할 수없는 다른 이유 :
- get 및 set으로 공개되지 않음 (또는
readonly
필드 용임) - 이것은 보유
[DefaultValue]
특성 및 그 값이다 bool ShouldSerializeFoo()
false를 반환 한 공용 메서드가 있습니다.bool FooSpecified {get;set;}
false를 반환 한 공용 속성 또는 필드가 있습니다.- 그것은 표시되어 있습니다
[XmlIgnore]
- 그것은 표시되어 있습니다
[Obsolete]
이 중 하나라도 직렬화되지 않습니다.
getter + setter에 대한 요점은 " Intro to Xml Serialization "페이지 의 세 번째 단락에서 설명합니다 . 실제로 콜 아웃 상자에 있습니다. 그것을 놓칠 수 없습니다!
Intro-to-XML 직렬화 http://www.freeimagehosting.net/uploads/2f04fea2db.png
(Freeimagehosting.net에서 너무 재미 있습니다)
적절한 Setter를 구현하고 싶지 않다면 (아마도 deserialize하거나 객체 값을 변경하고 싶지 않기 때문에) 이와 같은 더미 setter를 사용할 수 set { }
있으므로 XMLSerializer
작동하지만 Setter를 사용하면 아무 일도 일어나지 않습니다 ...
iE
public string ID { get { return _item.ID.ToString(); } set { } }
또한 null을 반환하는 속성은 직렬화되지 않습니다!
컬렉션 직렬화에 대해 추가 할 한 가지 더 :
XmlSerializer는 인터페이스 컬렉션을 무시합니다!
그리고 그것은 무시 한다는 의미 입니다. 다음과 같은 줄에 대한 예외가 발생합니다.
public IFoo Foo { get; set; }
다음에 대한 예외 는 없습니다 .
public ICollection<IFoo> LotsOfFoos { get { return this.fooBackingField; } }
클래스가 목록을 상속하고 자체 멤버도있는 경우 목록의 요소 만 직렬화됩니다. 클래스 멤버에있는 데이터는 캡처되지 않습니다. 이것을 알아내는 데 시간이 걸렸습니다!
IXmlSerializer
수동으로 직렬화를 구현하고 속성을 직렬화하는 이점을 누릴 수 있으며, 그 반대의 경우도 생성자 / 개인 필드 할당을 사용하여 직렬화를 해제 할 수 있습니다.
'Development Tip' 카테고리의 다른 글
JProfiler 또는 YourKit 중 더 나은 Java 프로파일 러는 무엇입니까? (0) | 2020.12.11 |
---|---|
좋은 온라인 대화식 정규식 자습서가 있습니까? (0) | 2020.12.11 |
명령이 bash 쉘 명령 기록에 들어가는 것을 방지 할 수 있습니까? (0) | 2020.12.11 |
PHP에서 동적으로 인스턴스 속성을 만들 수 있습니까? (0) | 2020.12.11 |
Scala 2.8과 Scala 2.7의 가장 큰 차이점은 무엇입니까? (0) | 2020.12.11 |