2009-02-22 2 views
46

이것은 나이가 들었으므로 어딘가에서 문서화 할 생각이었습니다. (질문하고 질문에 사과드립니다.) XmlSerializer에 의해 직렬화되는 클래스가 있었지만 출력 XML에 포함되지 않은 새로운 public 속성을 추가했습니다.XmlSerializer에서 공용 속성을 serialize하지 않는 이유는 무엇입니까?

어디에서나 찾을 수있는 문서에는 언급되어 있지 않지만 공용 속성에는 일련 번호가 있어야하며 일련 번호가 있어야합니다. 나는 당신이 직렬화하려고한다면 동일한 파일로부터 deserialize하기를 원한다고 가정하기 때문에 set과 get을 모두 갖는 속성 만 직렬화한다고 가정하기 때문에 이것이라고 생각합니다.

답변

76

앞서 언급했듯이 대부분의 속성에는 getter와 setter가 모두 있어야합니다. 주요 예외는 목록입니다. 예 :

private readonly List<Foo> bar = new List<Foo>(); 
public List<Foo> Bar {get { return bar; } } // works fine 

잘 작동합니다. 그러나, XmlSerializer이 발견되면 세터 - 그것이 공개라고 요구하면; 다음은 이 작동하지 않습니다 :

public List<Foo> Bar {get; private set;} // FAIL 

다른 이유는 직렬화되지 않을 수 있습니다

  • 을가 GET 공공 및 설정되지 않은 (또는 필드 readonly이다)가있다
  • a [DefaultValue] 특성을 가지며 그 값이
  • 이면 bool ShouldSerializeFoo() 공용을 반환합니다. false를 반환하는 메서드
  • 가 공개 bool FooSpecified {get;set;} 속성 또는 false를 반환 필드가
  • 그것이

[Obsolete] 표시되어 [XmlIgnore]

  • 표시되어
  • 이들 중 어떤 +는

  • +0

    비록 내가 얻을 수있는 몇 가지 속성이 있지만. 그것들은 또한 XmlArray와 XmlArrayItem 속성으로 표시되어 있습니다. 그래서 그것이 왜 그들이 집합을 잊어 버리는 이유입니다. – Rory

    +2

    어떤 경우에는 컬렉션을 반환하는 속성에는 집합이 필요하지 않지만 생성자에서 초기화해야합니다 ... 공용 생성자가없는 컬렉션의 경우입니다. 하지만이 행동은 나에게 일관성이없는 것 같습니다 ... –

    +0

    나는 Thomas,에게 감사 드리지 못했습니다; 나는 조사 할 것이다 ;-p –

    7

    게터에 대한 포인트를 직렬화하지 않는 원인이됩니다 세터는 "Intro to Xml Serialization"페이지의 세 번째 단락에 있습니다. 실제로는 콜 아웃 상자에 있습니다. 놓칠 수 없다!

    Intro-to-XML Serialization http://www.freeimagehosting.net/uploads/2f04fea2db.png

    직렬화되지 않는 경우는 null를 돌려줍니다

    +0

    아, 네가 맞다는 것은 틀렸다는 걸 알았지 만, 그걸 놓칠 수는 없다. – Rory

    +0

    나는 사람들이 헤드 라인을 무시하고 기사에서 상자를 외우며, 일반 텍스트를 무시하는 것보다 더 자주 연구를 읽었다. ?? 생산성에 반하는 것. – Cheeso

    +0

    @Cheeso : 맞습니다. Google 검색 결과에서 스폰서 링크를 본적이 없습니다.) –

    4
    또한

    특성 (Freeimagehosting.net와 너무 많은 재미)!

    +1

    아,하지만 null을 반환하는 null 가능 유형 속성은! 나는 이것을 공개 int 여기 있나요? 여기에 직렬화 된 GroupTypeId 속성 - Jon

    2

    클래스가 목록을 상속하고 자체 멤버가있는 경우 목록의 요소 만 직렬화됩니다. 반원들에게있는 자료는 수집되지 않습니다. 시간을내어 이것을 알아 냈습니다!

    +0

    아, 왜? 아무도 몰라? – almcnicoll

    5

    올바른 설정자를 구현하지 않으려면 (이 경우 객체 값을 역 직렬화하거나 변경하지 않으려는 경우)이 set { }과 같은 더미 설정기를 사용하면 XMLSerializer이 작동하지만 아무 것도 나타나지 않으면 세터 사용 ...

    iE

    public string ID { get { return _item.ID.ToString(); } set { } } 
    
    +2

    주니어 프로그래머가이 setter 속성을 사용하여 값을 설정한다고 생각하면 문제가 될 수 있습니다. 여전히 "새로운 예외를 던지기"를 선호합니다. – user384080

    1

    한가지 더 컬렉션의 직렬화에 대해 추가 :

    XmlSerializer를이 인터페이스의 컬렉션을 무시!

    그리고 그 말은 을 무시합니다. 당신은 같은 라인에 대한 예외를 얻을 것이다 동안 : 직렬화에서 당신은 IXmlSerializer를 구현하고 수동으로 직렬화를 할 수

    public ICollection<IFoo> LotsOfFoos { get { return this.fooBackingField; } } 
    
    0

    , 혜택 :

    public IFoo Foo { get; set; } 
    

    당신은 하지에 대한 예외를 얻을 것이다 속성 및 그 반대의 경우에도 생성자/개인 필드 할당을 사용하여 비 직렬화합니다.

    관련 문제