2011-04-29 4 views
13
public class Hat 
{ 
    [XmlTextAttribute] 
    public string Name { get; set; } 
    [XmlAttribute("Color")] 
    public string Color { get; set; } 
} 

var hat1 = new Hat {Name="Cool Hat", Color="Red"}; 
var hat2 = new Hat {Name="Funky Hat", Color=null}; 

이것은 내가 (통지 펑키 모자에 색상 속성이 누락) 무엇을 얻을직렬화 문자열 속성은

<Hats> 
<Hat Color="Red">Cool Hat</Hat> 
<Hat Color="">Funky Hat</Hat> 
</Hats> 

직렬화 기가 비워 두지 않고 비어있는 속성을 생성하도록하려면 어떻게해야합니까?

편집 :

내가 바보이고 내가 예를 들어, 코드를 단순화하고 싶었 기 때문에, 오류가 포함 된 예제를 만들어 낸다.

color 값이 ""(또는 string.empty)이면 실제로 빈 특성으로 직렬화됩니다. 그러나 실제로는 빈 문자열이 아닌 null 값을 가졌으므로 생략되었습니다.

그래서 내가 원하는 동작은 실제로 내가 만든 예제의 동작이었습니다.

죄송합니다.

+0

_ "색상의 값이" "(또는 String.Empty로는), 그것은 빈 속성으로 실제로 직렬화 그러나, 나는 정말. 빈 문자열이 아닌 null 값을 가졌기 때문에 제외되었습니다. "_ 와우는 이전에이 동작을 알아 채지 못했습니다. 흥미로운 점. –

답변

5

List<Hat>을 컨테이너로 사용해보십시오. 이 사용 :

var hats = new List<Hat> 
    { 
     new Hat { Name = "Cool Hat", Color = "Red" }, 
     new Hat { Name = "Funky Hat", Color = string.Empty } 
    }; 

using (var stream = new FileStream("test.txt", FileMode.Truncate)) 
{ 
    var serializer = new XmlSerializer(typeof(List<Hat>)); 
    serializer.Serialize(stream, hats); 
} 

내가 얻을이 :

<?xml version="1.0"?> 
<ArrayOfHat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Hat Color="Red">Cool Hat</Hat> 
    <Hat Color="">Funky Hat</Hat> 
</ArrayOfHat> 
+1

이것은 내 컨테이너가 이미 목록 이었기 때문에 나를 바른 길로 인도했다. – Kjensen

1

Specified 속성을 true로 설정할 수 있습니다. 또한, 나는이 같은 직렬화를 제어하기 위해 ## 지정된 속성을 사용할 수 있다고 생각 :

[XmlAttribute("Color")] 
public string Color { get; set; } 
[XmlIgnore] 
public bool ColorSpecified { get { return true; } } // will always serialize 

또는 당신은 한 null가 아닌로 직렬화 할 수 있습니다

[XmlIgnore] 
public bool ColorSpecified { get { return this.Color != null; } } 
+1

이것은 작동하지 않습니다. 직렬화 된 XML은 변경되지 않습니다. 그냥 분명히하기 위해 - 그것은 serializer가 bool 속성 [property] Specified -이 경우 ColorSpecified를 찾았 기 때문에 간단히 작동해야합니다? – Kjensen

+0

@Kjensen : 요소에 대해 작동한다는 것을 알고 있습니다. ([property] Specified는 serializer에 내장되고 하드 코딩 된 것입니다. http://msdn.microsoft.com/en-us/library/bb402199(v)를 참조하십시오. = exchg.140) .aspx). 동일한 것은 속성에 대해 작동하지 않을 수 있습니다. – mellamokb

1

두 가지 방법이 있습니다 할 수 있어요.

[XmlElement(IsNullable=true)]을 사용하면 Null 값을 인식하게됩니다.

""대신 String.Empty를 사용할 수도 있습니다. 이것은 빈 문자열로 인식되며 null이 아닙니다.

+10

'string.Empty == ""' – Andrey

+0

[XmlElement (Isnullable = true)]는 속성이 아닌 요소에서만 작동합니다. – Kjensen

+0

시도해보십시오. 그것은 오래되었지만 전에는 저에게 효과가 있었음을 기억합니다. String.Empty와 ""사이에는 약간의 차이가 있습니다. 전자는 실제로 객체를 생성하지 않습니다. –