我想将以下类序列化为另一个类的子类。
[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;
答案 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
将无法实现这一点