Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过分部类隐藏C#XmlSerializer的属性_C#_Partial_Xmlserializer - Fatal编程技术网

通过分部类隐藏C#XmlSerializer的属性

通过分部类隐藏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 {

根据W3C,XSD布尔数据类型定义为0、1、true或false。外部方提供了一个xsd,我对此没有任何影响,您可能已经猜到,它们所需要的布尔值不是C#XmlSerializer将布尔值序列化为的默认值。不接受True和false,仅接受0和1。更糟糕的是,序列化为xml的类是由xsd.exe自动生成的,因此我不想更改这些类,因为在我之后的开发人员在运行xsd.exe工具后很可能会忘记这一额外步骤

因此,以下解决方案存在问题:

[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; }