2014-01-24 3 views
1

Я хочу сериализовать следующий класс как дочерний объект другого класса.C# XML сериализует элементы из объекта типа без пространства имен

[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

как я могу избавиться от имен моего 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 без дополнительных аннотаций.

+0

Благодарим вас за быстрый ответ. – AasK

+0

, и нет возможности для XmlSerializer разделять теги в зависимости от структуры theire? – AasK

+0

@ пользователь3226908 нет, не действительно. Вы можете реализовать 'IXmlSerializable', но это откровенно ужасно. К тому времени, как вы это сделали, было бы проще использовать LINQ-to-XML или 'XmlDocument' –

Смежные вопросы