How can I get XmlSerializer to encode bools as yes/no?

后端 未结 7 2017
情话喂你
情话喂你 2020-12-31 05:49

I\'m sending xml to another program, which expects boolean flags as \"yes\" or \"no\", rather than \"true\" or \"false\".

I have a class defined like:



        
7条回答
  •  别那么骄傲
    2020-12-31 06:09

    Ok, I've been looking into this some more. Here's what I've come up with:

    // use this instead of a bool, and it will serialize to "yes" or "no"
    // minimal example, not very robust
    public struct YesNo : IXmlSerializable {
    
        // we're just wrapping a bool
        private bool Value;
    
        // allow implicit casts to/from bool
        public static implicit operator bool(YesNo yn) {
            return yn.Value;
        }
        public static implicit operator YesNo(bool b) {
            return new YesNo() {Value = b};
        }
    
        // implement IXmlSerializable
        public XmlSchema GetSchema() { return null; }
        public void ReadXml(XmlReader reader) {
            Value = (reader.ReadElementContentAsString() == "yes");
        }
        public void WriteXml(XmlWriter writer) {
            writer.WriteString((Value) ? "yes" : "no");
        }
    }
    

    Then I change my Foo class to this:

    [XmlRoot()]
    public class Foo {      
        public YesNo Bar { get; set; }
    }
    

    Note that because YesNo is implicitly castable to bool (and vice versa), you can still do this:

    Foo foo = new Foo() { Bar = true; };
    if ( foo.Bar ) {
       // ... etc
    

    In other words, you can treat it like a bool.

    And w00t! It serializes to this:

    yes
    

    It also deserializes correctly.

    There is probably some way to get my XmlSerializer to automatically cast any bools it encounters to YesNos as it goes - but I haven't found it yet. Anyone?

提交回复
热议问题