Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.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# 序列化中基类字段的自定义XML元素名称_C#_Xml_Serialization_Inheritance_Xml Serialization - Fatal编程技术网

C# 序列化中基类字段的自定义XML元素名称

C# 序列化中基类字段的自定义XML元素名称,c#,xml,serialization,inheritance,xml-serialization,C#,Xml,Serialization,Inheritance,Xml Serialization,在执行序列化时,如何更改从基类继承的字段的XML元素名 例如,我有下一个基类: public class One { public int OneField; } 序列化代码: static void Main() { One test = new One { OneField = 1 }; var serializer = new XmlSerializer(typeof (One)); TextWriter writer = new StreamWriter

在执行序列化时,如何更改从基类继承的字段的XML元素名

例如,我有下一个基类:

public class One
{
    public int OneField;
}
序列化代码:

static void Main()
{
    One test = new One { OneField = 1 };
    var serializer = new XmlSerializer(typeof (One));
    TextWriter writer = new StreamWriter("Output.xml");
    serializer.Serialize(writer, test);
    writer.Close();
}
static void Main()
{
    Two test = new Two { OneField = 1, TwoField = 2 };

    var serializer = new XmlSerializer(typeof (Two));
    TextWriter writer = new StreamWriter("Output.xml");
    serializer.Serialize(writer, test);
    writer.Close();
}
我得到了我需要的:

<?xml version="1.0" encoding="utf-8"?>
<One xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <OneField>1</OneField>
</One>
序列化代码:

static void Main()
{
    One test = new One { OneField = 1 };
    var serializer = new XmlSerializer(typeof (One));
    TextWriter writer = new StreamWriter("Output.xml");
    serializer.Serialize(writer, test);
    writer.Close();
}
static void Main()
{
    Two test = new Two { OneField = 1, TwoField = 2 };

    var serializer = new XmlSerializer(typeof (Two));
    TextWriter writer = new StreamWriter("Output.xml");
    serializer.Serialize(writer, test);
    writer.Close();
}
因此,我得到下一个输出:

<?xml version="1.0" encoding="utf-8"?>
<Two xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <OneField>1</OneField>
  <SecondField>2</SecondField>
</Two>

1.
2.
问题是我想将此输出中的
OneField
更改为
FirstField
,而不涉及基类代码(因为我也会使用它,而且名称必须是原始的)。我怎样才能做到这一点

谢谢。

试试这个:

public class Two : One
{
    private static XmlAttributeOverrides xmlOverrides;
    public static XmlAttributeOverrides XmlOverrides
    {
        get
        {
            if (xmlOverrides == null)
            {
                xmlOverrides = new XmlAttributeOverrides();
                var attr = new XmlAttributes();
                attr.XmlElements.Add(new XmlElementAttribute("FirstField"));
                xmlOverrides.Add(typeof(One), "OneField", attr);
            }
            return xmlOverrides;
        }
    }

    [XmlElement("SecondField")]
    public string TwoField;

}
而且序列化程序初始化要容易得多:

 var xmls = new System.Xml.Serialization.XmlSerializer(typeof(Two), Two.XmlOverrides);
试试这个:

public class Two : One
{
    private static XmlAttributeOverrides xmlOverrides;
    public static XmlAttributeOverrides XmlOverrides
    {
        get
        {
            if (xmlOverrides == null)
            {
                xmlOverrides = new XmlAttributeOverrides();
                var attr = new XmlAttributes();
                attr.XmlElements.Add(new XmlElementAttribute("FirstField"));
                xmlOverrides.Add(typeof(One), "OneField", attr);
            }
            return xmlOverrides;
        }
    }

    [XmlElement("SecondField")]
    public string TwoField;

}
而且序列化程序初始化要容易得多:

 var xmls = new System.Xml.Serialization.XmlSerializer(typeof(Two), Two.XmlOverrides);

这里有一个解决方法:重写子类中的字段,并用您需要的任何名称标记被重写的字段。比如说,

class One
{
    public int OneField { get; set; }
}

class Two : One
{
    [XmlElement("FirstField")]
    public new int OneField
    {
       get { return base.OneField; }
       set { base.OneField = value; }
    }
}

这里有一个解决方法:重写子类中的字段,并用您需要的任何名称标记被重写的字段。比如说,

class One
{
    public int OneField { get; set; }
}

class Two : One
{
    [XmlElement("FirstField")]
    public new int OneField
    {
       get { return base.OneField; }
       set { base.OneField = value; }
    }
}

完美的正是我需要的。但有没有办法将这种重写嵌入到类声明中,以便在序列化对象时随时自动工作?不幸的是,据我所知,没有。您可以尝试将
XmlAttributeOverrides
对象公开为目标类上的静态字段,以使其更简单。完美!正是我需要的。但有没有办法将这种重写嵌入到类声明中,以便在序列化对象时随时自动工作?不幸的是,据我所知,没有。您可以尝试将
XmlAttributeOverrides
对象公开为目标类上的静态字段,以使其更简单。当我尝试此操作时,序列化程序引发异常:{“反射类型“”时出错”}@Jay:Darn,在发布之前忘记检查代码。记得不久前这么做过,但一定是出了什么问题。您上面发布的解决方案很好。当我尝试此方法时,序列化程序引发了一个异常:{“存在反映类型“”的错误”}@Jay:Darn,在发布之前忘记检查代码。记得不久前这么做过,但一定是出了什么问题。你在上面发布的解决方案很巧妙