当前位置: 首页 > 编程语言 > C#

如何让XmlSerializer将bool编码为yes-no?

时间:2023-04-10 13:44:57 C#

如何让XmlSerializer将bool编码为是/否?我将xml发送到另一个程序,它期望布尔标志为“是”或“否”,而不是“真”或“假”。我有一个这样定义的类:[XmlRoot()]publicclassFoo{publicboolBar{get;放;当我序列化它时,我的输出看起来像这样:true但我希望它像这样:yes我可以在序列化时这样做吗?我宁愿不必求助于此:[XmlRoot()]publicclassFoo{[XmlIgnore()]publicboolBar{get;放;}[XmlElement("Bar")]publicstringBarXml{get{return(Bar)?“是”:“否”;请注意,我还希望能够再次反序列化此数据。好的,我一直在研究这个问题。这是我想到的://使用它而不是bool,它将序列化为“是”或“否”//最小的例子,不是很健壮publicstructYesNo:IXmlSerializable{//我们只是包装一个boolprivate布尔值;//允许对bool进行隐式转换publicstaticimplicitoperatorbool(YesNoyn){returnyn.Value;}publicstaticimplicitoperatorYesNo(boolb){returnnewYesNo(){Value=b};}//实现IXmlSerializablepublicXmlSchemaGetSchema(){returnnull;}publicvoidReadXml(XmlReaderreader){Value=(reader.ReadElementContentAsString()=="yes");}publicvoidWriteXml(XmlWriterwriter){writer.WriteString((Value)?"yes":"no");然后我将Foo类更改为:[XmlRoot()]publicclassFoo{publicYesNoBar{get;放;注意,因为YesNo可以隐式转换为bool(反之亦然),所以你仍然可以这样做:Foofoo=newFoo(){Bar=true;};if(foo.Bar){//...换句话说,您可以将其视为布尔值。和!它序列化为:是的,它也正确反序列化。可能有一些方法可以让我的XmlSerializer自动将它遇到的任何bool转换为YesNos,但我还没有找到它。任何人?很简单。使用代理属性。对实际属性应用XmlIgnore。Proxy是一个字符串,必须使用带有元素名称覆盖的XmlElement属性。在覆盖中指定实际属性的名称。代理属性根据实际属性的值进行不同的序列化。您还必须为Surrogate提供一个setter,并且setter应该适当地设置实际属性,无论它序列化什么值。换句话说,它需要双向进行。片段:publicclassSomeType{[XmlElement]publicintIntValue;[XmlIgnore]公共布尔值;[XmlElement("Value")]publicstringValue_Surrogate{get{return(Value)?“是的,绝对是!”:“绝对不是!”;}set{Value=(value=="Yes,definitely!");}}}单击此处获取完整的可编译源代码示例。将bool值序列化为“yes”或“no”会将数据类型更改为boolean。相反,您能否添加一个单独的属性来评估布尔值并根据其数据类型返回“是”或“否”?也许您甚至可以通过使返回类型成为仅指定那些值的枚举来强制“是”或“否”。publicYesOrNoDoYouLoveIt{get{returnboolToEvaluate?是或否。是:是或否。否;这可能有点矫枉过正,但它可能会满足您的需要。我为这样一个简单的值想出一个枚举的唯一原因是如果您要限制该值而不是允许任何字符串。我使用属性方法,但不是检查字符串是否等于是,我更愿意检查字符串是否以(不区分大小写)“YT1”开头。这允许包含true、True、t、T、y、Y、yes、Yes、1等的文件都将评估为true。虽然我可以将false指定为false、False、f、F、n、N、no、No、0等,但与true不匹配的任何值仍将是false。您的财产示例可能是您执行此操作的最简单方法。如果有帮助,我相信您不需要将其设为公共属性,因为该属性在您后面的类上实现了ISerializable。要启用反序列化,您应该能够实现set{Bar=value=="yes";}set{Bar=value=="yes";实现OnSerializing和OnDeserializing方法怎么样?您需要做的听起来更像是显示问题。如果您的应用程序允许,最好将数据类型保持为布尔值并在UI中显示是/否。@Blorgbeard:如果对象类中有多个这样的YesNo类,请确保阅读整个元素。publicvoidReadXml(XmlReaderreader){stringelement=reader.ReadOuterXml();intstartIndex=element.IndexOf('>')+1;intlength=element.LastIndexOf('否则这可能会导致问题。ReadXml方法必须使用WriteXml方法写入的信息重构对象。调用此方法时,读取器位于包含类型信息的元素的开头.即,就在表示序列化对象开始的开始标记之前。当此方法返回时,它必须从头到尾读取整个元素,包括其所有内容。与WriteXml方法不同,包装元素不是由框架自动处理。你的实现必须这样做。不遵守这些定位规则可能会导致意外的运行时代码生成异常或数据损坏。以上是C#学习教程:HowtoletXmlSerializerencodeboolasyes/no?All分享的内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: