C#XML序列化来自没有命名空间的对象类型的元素

时间:2014-01-24 12:41:44

标签: c# xml object xml-serialization

我想将以下类序列化为另一个类的子类。

[XmlInclude(typeof(string)), XmlInclude(typeof(XML_Variable))]
public class XMLTagDataSection
{
    [XmlElement("Offset")]
    public int XML_Offset        { get; set; }

    [XmlElement("Type")]
    public EnuDataType XML_type  { get; set; }

    [XmlElement("Value")]
    public object XML_Value      { get; set; }

    [XmlElement("Info")]
    public string XML_Info       { get; set; }

    [XmlElement("NumBytes")]
    public int XML_NumBytes      { get; set; }
}

public class XML_Variable
{
    [XmlElement("Variable", IsNullable = false)]       
    public int   Variable { get; set; }
}

这是我的实际输出:

<Data>
  <Offset>0</Offset>
  <Type>ASCII</Type>
  <Value xmlns:q1="http://www.w3.org/2001/XMLSchema" d7p1:type>test-string</Value>
  <Info>some text</Info>
  <NumBytes>11</NumBytes>
</Data>
<Data>
  <Offset>11</Offset>
  <Type>ASCII</Type>
  <Value d7p1:type="XML_Variable" xmlns:d7p1="http://www.w3.org/2001/XMLSchema-instance">
  <Variable>0</Variable>
  </Value>
  <Info>a variable</Info>
  <NumBytes>5</NumBytes>

如何摆脱XML_Value元素的命名空间? 得到以下输出:

<Data>
  <Offset>0</Offset>
  <Type>ASCII</Type>
  <Value>test-string</Value>
  <Info>some text</Info>
  <NumBytes>11</NumBytes>
</Data>
<Data>
  <Offset>11</Offset>
  <Type>ASCII</Type>
  <Value>
    <Variable>0</Variable>
  </Value>
  <Info>a variable</Info>
  <NumBytes>5</NumBytes>

我使用这部分代码来序列化父元素:

XmlSerializerNamespaces NameSpace = new XmlSerializerNamespaces();
NameSpace.Add("", "");

XmlSerializer xmlserializer = new XmlSerializer(typeof(XMLRoot));

FileStream str = new FileStream(fileName, FileMode.Create);

xmlserializer.Serialize(str, Root_Tag, NameSpace);

str.Close();

return true;

1 个答案:

答案 0 :(得分:1)

  

如何摆脱XML_Value元素的命名空间?得到以下输出:

简单:它没有。可以使用别名前缀

指定元素的名称空间
<foo:Value ...>

或通过保留的xmlns属性:

<Value xmlns="...." ...>

您所指的是XmlSerializer 需要反序列化该数据的其他信息的命名空间限定符。它只需要它,因为类型是object,并且尽职尽责,它希望以后能够理解这些数据 - 否则它永远不会反序列化它。因此,一种选择是正确声明您的类型:

[XmlElement("Value")]
public XML_Variable XML_Value { get; set; }

然后不需要这些额外的信息。

如果这些都不可能,那么XmlSerializer 对您来说不是一个好选择。请考虑使用XDocument(LINQ-to-XML)或XmlDocument

序列化程序的整个要点是能够在两个方向上转换数据 ,如果没有其他注释,object将无法实现这一点