通过分部类隐藏C#XmlSerializer的属性
根据W3C,XSD布尔数据类型定义为0、1、true或false。外部方提供了一个xsd,我对此没有任何影响,您可能已经猜到,它们所需要的布尔值不是C#XmlSerializer将布尔值序列化为的默认值。不接受True和false,仅接受0和1。更糟糕的是,序列化为xml的类是由xsd.exe自动生成的,因此我不想更改这些类,因为在我之后的开发人员在运行xsd.exe工具后很可能会忘记这一额外步骤 因此,以下解决方案存在问题:通过分部类隐藏C#XmlSerializer的属性,c#,partial,xmlserializer,C#,Partial,Xmlserializer,根据W3C,XSD布尔数据类型定义为0、1、true或false。外部方提供了一个xsd,我对此没有任何影响,您可能已经猜到,它们所需要的布尔值不是C#XmlSerializer将布尔值序列化为的默认值。不接受True和false,仅接受0和1。更糟糕的是,序列化为xml的类是由xsd.exe自动生成的,因此我不想更改这些类,因为在我之后的开发人员在运行xsd.exe工具后很可能会忘记这一额外步骤 因此,以下解决方案存在问题: [XmlIgnore] public bool MyValue {
[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); }
}
因此,我的想法是MyBoolClass是一个局部类,我可以在一个单独的定义中为它提供我自己的自定义实现,在这个定义中,我处理true->1 false->0问题
我的代码如下:
namespace MyUnitTests.Classes {
public interface IMyBoolClass {
[XmlIgnore]
bool Item { get; set; }
}
public partial class MyBoolClass : IMyBoolClass {
[XmlElement("Node")]
public string SerializableItem {
get { return this.Item ? "1" : "0"; }
set { this.Item = System.Xml.XmlConvert.ToBoolean(value); }
}
}
}
因此,我有一个接口IMyBoolClass,我设计它来处理XmlIgnore,并声明了属性SerializableItem,它应该序列化实际的0和1。不幸的是,发生的异常表明XmlIgnore未应用于xsd.exe生成的MyBoolClass.Item
我有以下单元测试
[TestMethod]
public void TestMethod2() {
MyRootClass root = new MyRootClass() {
MyBoolClass = new MyBoolClass() {
Item = false
}
};
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyRootClass));
using (StringWriter writer = new StringWriter()) {
xmlSerializer.Serialize(writer, root);
string xml = writer.ToString();
}
}
出现以下例外情况:
There was an error reflecting property 'MyBoolClass
There was an error reflecting property 'Item'
The XML element 'Node' from namespace 'XX:ZZ:01' is already present in the current scope. Use XML attributes to specify another XML name or namespace for the element
明显变化:
[XmlElement("Node")]
在我自己对MyBoolClass的部分定义中:
[XmlElement("Node1")]
解决了此问题并生成以下XML:
<?xml version="1.0" encoding="utf-16"?>
<MyRootClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:XX:01">
<MyBoolClass xmlns="urn:XX:YYYY:01">
<Node1 xmlns="XX:ZZ:01">0</Node1>
<Node xmlns="XX:ZZ:01">false</Node>
</MyBoolClass>
</MyRootClass>
在xsd.exe为XmlSerializer生成的MyBoolClass类中
任何提示和技巧都将非常感谢,如果有人有其他精彩的想法,我将非常感激
<?xml version="1.0" encoding="utf-16"?>
<MyRootClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:XX:01">
<MyBoolClass xmlns="urn:XX:YYYY:01">
<Node1 xmlns="XX:ZZ:01">0</Node1>
<Node xmlns="XX:ZZ:01">false</Node>
</MyBoolClass>
</MyRootClass>
public bool Item { get; set; }