2011-12-18 3 views
5

XmlSerializer에서 만든 XML에 기본값이있는 경우 속성을 제외하고 싶습니다. XmlSerializer를 사용하여이 작업을 수행 할 수 있습니까? 아니면 IXmlSerializable을 조사해야합니까?XmlSerializer를 사용하여 해당 값에 따라 속성을 무시할 수있는 방법

예를 들어, 나는 다음과 같은 클래스를 가질 수있다 :

public class PositionedObject 
{ 
    public float X 
    { get; set; } 

    public float Y 
    { get; set;} 
} 

나는 그것이 PositionedObject의 인스턴스를 직렬화 할 때 값이 0 인 경우, X를 포함하지 않도록하는 XmlSerializer를 얘기하고 싶습니다 (와 같은 0 인 경우 Y로). 시리얼 라이저는 속성이 직렬화 여부를 결정하는이 메소드를 호출

public bool ShouldSerializeX() 
{ 
    return X != 0; 
} 

:

답변

9

그냥 값이 0이 아닌 경우 true를 반환 ShouldSerializeX라는 방법을 선언합니다.

+1

이 답변은 충분하지 않습니다. 시리얼 라이저가 그러한 방법에 대해 어떻게 알지는 못합니다. 게다가, 이것은 확장 할 수 없습니다. – Amy

+1

@Inuyasha, 너 해봤 니? 나는 그것이 작동한다는 것을 알고, 나는이 솔루션을 여러 번 사용했다. 문서화되어 있지는 않지만 XML serializer 코드를 살펴보면이 메서드가 있으면 호출하는 것을 볼 수 있습니다 (또는 XSpecified라는 읽기 전용 속성을 만들 수도 있습니다). 어쨌든, 더 확장 성있는 방법을 알고 있습니까? –

+0

Inuyasha - 실제로 해봤습니까? 이 답변을 바탕으로 나는 Google에 몇 가지 일을 할 수 있었고 이것이 효과가 있다고 주장하는 여러 가지 기사를 발견했습니다. 나는 지금 시행 중이다. 여기에 몇 가지 추가 정보가 있습니다. http://horacegoescoding.blogspot.com/2009/04/using-shouldserialize-for-conditional.html –

1

클래스가 IXmlSerializable을 구현할 수 있으며 WriteXml 메서드에서 기본으로 고려하는 속성을 직렬화하지 않도록 선택합니다. 당신이 원하는 아마 가장 간단한 방법입니다 귀하의 위치에서

public class PositionedObject : IXmlSerializable 
{ 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     if ( Position != DefaultPosition) 
      writer.WriteAttributeString("Position", Position); 
    } 
} 

는 플로트 쌍이며 일부 허용 오차를

+2

가능하다면 항상 "직렬화를 위해 IXmlSerializable을 구현하지 마십시오"라고 말할 것입니다 - 다소 함정이 깔려 있습니다 ... 가능하다면 항상 첫 번째 검사 인 XmlSerializer가 직접 지원하지 않습니다 (예 : 이 경우), 두 번째는 지나치게 복잡한 구현이 아니라 XML에 적합한 DTO를 사용합니다. –

0

토마스의 방법을 사용해야 할 수도 있습니다. 그러나 기술적으로 값 유형은 항상 값을 가지고 있다고 생각할 수도 있습니다. 아마도 직렬화해야합니다. 은 string 또는 다른 참조 유형으로 선언 할 경우 X 요소를 건너 뜁니다.
물론 X 좌표를 문자열로 선언하는 것은 어리석은 일이지만 null 허용 float?으로 선언 할 수 있습니다. <X xsi:nil="true" />으로 serialize되며, 일 수 있습니다.은 실제로 원하는 것과 더 가깝습니다 ... XML 꽤보고, 토마스의 제안을 받았습니다.

7

지원되는 다른 XmlSerializer 패턴 1 개;

[DefaultValue({whatever})] 
public SomeType SomeProperty {get;set;} 

참고 그러나 당신의 매개 변수가없는 생성자 이 값을 지정해야합니다, 또는 예기치 않은 결과가 발생할 것이다.

+0

나는이 것에 대해 몰랐습니다. –

+0

매우 우아한 솔루션, 나를 위해 작동! –

관련 문제