2012-01-20 2 views
0

Я пытаюсь сериализовать IList. Поэтому я использую для этого IXmlSerializable. Классы являютсяIList и пользовательский XML Сериализация вложенных объектов

class SerializeTarget : IXmlSerializable 
{ 

    public IList<Target> Targets { get; set; } 

    public string Name; 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     throw new NotImplementedException(); 
    } 

    /// <summary> 
    /// </summary> 
    /// <param name="writer"> 
    /// The writer. 
    /// </param> 
    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteStartElement("SerializeTarget"); 
     writer.WriteElementString("Name", Name); 
     writer.WriteStartElement("Targets"); 
     foreach (var target in Targets) 
     { 
      ///?????? 
     } 
     writer.WriteEndElement(); 
     writer.WriteEndElement(); 
    } 

    #endregion 
} 

class Target : IXmlSerializable 
{ 
    public String Name { get; set; } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     throw new NotImplementedException(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteString(Name); 
    } 

    #endregion 
} 

Как я могу назвать сериализации вложенного объекта из SerializeTarget.Serialize?

+1

Рассмотрим назвав 'IList ' 'не Target' но' Targets' –

+1

Почему бы вам не использовать класс 'XmlSerializer'? – Groo

ответ

1

Если вы будете следовать советам @Henk Хольтерман вы хотите изменить WriteXml на цель быть

writer.WriteAttributeString("Name",Name); 

вы можете также использовать вместо WriteXml()

XmlSerializer xmlSerializer = new XmlSerializer(target.GetType()); 
xmlSerializer.Serialize(writer, target); 

в любом случае ш ульд дать вам:

<?xml version="1.0" encoding="utf-16" ?> 
<SerializeTarget> 
    <Name /> 
<Targets> 
<Target> 
    <Target Name="foo" /> 
    </Target> 
<Target> 
    <Target Name="foo2" /> 
    </Target> 
<Target> 
    <Target Name="foo3" /> 
</Target> 
</Targets> 
</SerializeTarget> 
1

Это кажется очень легким:

foreach (var target in Target) 
{ 
    ///?????? 
    target.WriteXml(writer); 
} 

Есть ли проблемы с этим?

Edit: Но вы, вероятно, потребуется начальных и конечных элементов тоже, они должны идти внутри метода Target:

public void WriteXml(System.Xml.XmlWriter writer) 
{ 
    writer.WriteStartElement("Target"); 
    writer.WriteString(Name); 
    writer.WriteEndElement(); 
}