Development Tip

내 공용 속성이 XmlSerializer에 의해 직렬화되지 않는 이유는 무엇입니까?

yourdevel 2020. 12. 11. 20:22
반응형

내 공용 속성이 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수동으로 직렬화를 구현하고 속성을 직렬화하는 이점을 누릴 수 있으며, 그 반대의 경우도 생성자 / 개인 필드 할당을 사용하여 직렬화를 해제 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/575432/why-isnt-my-public-property-serialized-by-the-xmlserializer

반응형