2008-09-17 7 views
22

XML 스키마 부 2는 부울로 정의 된 데이터 유형의 인스턴스가 다음 법적 리터럴 {true, false, 1, 0}을 가질 수 있음을 지정합니다. 다음 XML은 예를 들어 비 직렬화 될 때 부울 속성 "Emulate"를 true으로 설정합니다. 내가 다시 XML로 개체를 직렬화 할 때XML 부울 값을 0과 1로 serialize

<root> 
    <emulate>1</emulate> 
</root> 

그러나, 내가 대신 숫자 값의 true를 얻을. 내 질문은 XML의 부울 표현을 제어 할 수있는 방법이 있습니까?

+0

XML 직렬화를 수행하기 위해 사용중인 것을 언급 할 수 있습니다. –

+1

CoreReview.SE에서 동일한 주제에 대한 보완적인 [질문] (http://codereview.stackexchange.com/questions/4829/presenting-a-boolean-as-an-int-for-xmlserialization-in-c) – MPelletier

답변

3

원하는 경우 클래스의 직렬화 된 출력을 변경할 수있는 IXmlSerializable을 구현할 수 있습니다. 이렇게하면 GetSchema(), ReadXml (XmlReader r) 및 WriteXml (XmlWriter r)의 3 가지 메서드가 만들어집니다. 인터페이스를 구현할 때 .NET 대신 객체 자체를 직렬화하려고 시도하는 대신이 메소드가 호출됩니다.

[XmlIgnore] 
public bool MyValue { get; set; } 

/// <summary>Get a value purely for serialization purposes</summary> 
[XmlElement("MyValue")] 
public string MyValueSerialize 
{ 
    get { return this.MyValue ? "1" : "0"; } 
    set { this.MyValue = XmlConvert.ToBoolean(value); } 
} 

또한 다른 사용할 수 있습니다 또한 속성 일부 XmlSerializer를 사용하여 마술을 수행 할 수 있습니다

http://www.developerfusion.co.uk/show/4639/

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

+1

그래, 나는 그것을 피하기를 바랬지 만 여기에는 선택의 여지가없는 것 같다. 감사합니다 :) –

1

아니요, 기본 System.Xml.XmlSerializer를 사용하지 않습니다.이를 달성하려면 데이터 형식을 int로 변경하거나 고유 한 직렬화 코드를 제공해야합니다 (가능하지만 재미는별로 없습니다).

그러나 대신 XSLT를 사용하거나 단순히 문자열 대체를 사용하여 생성 된 XML을 후 처리 할 수 ​​있습니다. 약간의 해킹이 있지만 개발 시간과 런타임 모두에서 꽤 빠릅니다.

51

:

예에서 찾아 볼 수있다 만약 당신이 그것에 불쾌감을 느끼면이 회원을 인텔리 센스에서 숨길 수있는 속성! 완벽한 솔루션은 아니지만 IXmlSerializable을 구현하는 것보다 빠를 수 있습니다.

+4

이것은 끔찍한 일이지만, 정확하게 문제를 해결합니다! 내 아침 식사의 단기 보존을 위협하기위한 Upvote. –

+0

이것은 정확히 내가 찾고 있었던 것이다! 대단히 고마워, 나는 결코 "true"와 "false"로 불리언 값을 XML에 저장할 수 없다. – Alex

+0

가장 좋은 대답은 아닙니다. 이제는 하나가 아닌 두 개의 속성이 있습니다. 내가 여기에 훨씬 깨끗한 솔루션을 발견 : https://stackoverflow.com/questions/5963423/xmlserializer-property-converter#answer-7775097 간단히 말해, IXmlSerializable을 구현하는 새로운 클래스/구조체를 만듭니다. – Fl4v