2011-03-10 3 views
1

클래스를 직렬화 할 수 있습니다. 속성 중 하나는 int이며, 필드에 값이 제공되지 않으면 태그는 여전히 존재하지만 0 값을 갖습니다. 왜냐하면 int는 null로 지정할 수 없기 때문입니다.C# XML serialization int 태그 값이 제공되지 않았습니다.

내가 가진 문제는 XML을 받기를 원하는 클라이언트가 값이 제공되지 않은 경우 태그를 전혀보고 싶지 않다는 것입니다. 그들은 0 값을 가진 태그를보고 싶지 않습니다.

아이디어가 있으십니까?

public int? Foo { get; set; } 

또한 개체의 API에서이 작업을 숨길 수 있습니다 : 당신이 그것을 null이 때 억제 할 것 int?을하면

답변

3

private int? foo; 
public int Foo { 
    get { return foo.GetValueOrDefault(); } 
    set { foo = value; } 
} 
public bool ShouldSerializeFoo() { return foo.HasValue;} 

ShouldSerialize*XmlSerializer에 의해 자동으로 인식 할 수있는 패턴이다

1

[DefaultValue (0)] 속성을 속성에 적용하면 값은 onl입니다.

짧은 예 : 제 직렬화 된 오브젝트가 0 이외의 값을 갖는 두 번째가 기록 가치의 속성을 갖고 있지 않는

class Program 
{ 
    static void Main(string[] args) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Serialized)); 
     Serialized s = new Serialized(); 
     serializer.Serialize(Console.Out, s); 

     Serialized s2 = new Serialized { Value = 10 }; 
     serializer.Serialize(Console.Out, s2); 

     Console.ReadLine(); 
    } 
} 

public class Serialized 
{ 
    [XmlAttribute] 
    [DefaultValue(0)] 
    public int Value { get; set; } 
} 

을 Y는 그 값이 다른 경우 직렬화.

+0

이 접근법의 유일한 문제점은'0' *이 유효한 int이므로, 많은 경우에 유효한 값이 억제됩니다. 값이 합법적으로 0이 아니라면 괜찮습니다. –

+0

네가 맞아, 나는 그것을 고려하지 않았다. 이 문제에 대한 일반적인 해결책으로서 확실히 단점입니다. 그러나 ShouldSerializeValue 메서드가있는 사용자 지정 PropertyDescriptor를 사용하여 솔루션을 적용 할 수는 있지만 추가 속성은 필요하지 않습니다. –

관련 문제