13

일부 XML을 비 직렬화하는 데 문제가 있습니다. 제 3자가 제공 한 XML은 매우 장황합니다. 따라서 특정 요소에 대한 값이 설정되어 있지 않으면 빈 요소 (예 : <element1 />)가 제공됩니다.XML 데코 레이션을 사용하여 직렬화 해제시 기본값 지정

이것은 정수를 저장하는 요소와 같은 특정 요소에 대한 문제입니다. 제 3자를 제어 할 수 있으므로 기본값 (<myinteger>0</myinteger>)을 지정하거나이 요소를 완전히 생략 할 수 있습니다. 이 두 가지 모두 문제를 피해야합니다.

그러나 나중에 제어 할 권한이없는 상황이있을 수 있습니다.이 경우 장식을 통해 기본값을 지정하는 방법이 있습니까?

[XmlElement("myinteger")=0???] 
    public int MyInteger 
    { 
     get 
     { 
      return myInteger; 
     } 
     set 
     { 
      myInteger= value; 
     } 
    } 

답변

32

XmlSerializer 지원 [DefaultValue]을 수행하지만, 직렬화 동안 그것을 사용합니다. 비 직렬화 동안 단순히 생성자를 실행 한 다음 들어오는 값을 받아 적용합니다. 일반적인 접근법은 다음 생성자 (또는 초기화 필드)를 사용한다 : 그러나

public Foo() { 
    Bar = 4; 
} 
[DefaultValue(4), XmlAttribute("bar")] 
public int Bar {get;set;} 

단계; XmlSerializer의 해석은 "빈 요소를 제공"하는 것이 아니라 오히려 "요소 (/ 속성)를 생략"하는 것입니다. 심지어 int?은 "비어 있음"으로 매핑되지 않습니다. 요소를 처리하려면 문자열로 처리해야합니다. 어느 추한입니다.

+1

음 ... 간단히 말해서 제 3자가 설명의 빈 요소를 생략하는 것이 가장 쉬운 해결책 인 것 같습니다. 나는 그 선택의 사치가없는 곳에서 내가 할 수있는 것이 궁금했다. 나는 문자열 옵션을 고려해 보았습니다. 그러나 그것은 단지 웜의 큰 깡통 일뿐입니다 ... – CJM

+0

역 직렬화 중에 적어도 하나의 중요한 효과가 있습니다. 요소가 비어 있고 DefaultValue가 없으면 구문 분석 오류가있을 수 있습니다. 그러나 그것과 함께 [generated code] (http://msdn.microsoft.com/en-us/library/aa302290.aspx)는 빈 요소를 건너 뜁니다. –

0

[DefaultValue]를 사용한 장식은 항상 작동하지 않으므로 완전한 해결책으로 보이지 않습니다. 또 다른 간단한 해결책 (깨끗하지 않을 수도 있음)

public string _sourceSubFolderName; 
    [DefaultValueAttribute("")] 
    [XmlElement("SourceSubFolderName")] 
    public string SourceSubFolderName 
    { 
     get { return string.IsNullOrEmpty(_sourceSubFolderName) ? 
       string.Empty : _sourceSubFolderName; } 
     set { _sourceSubFolderName = value; } 
    }