2012-01-20 64 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 Holterman建議你也想對目標的變化中WriteXML到是

writer.WriteAttributeString("Name",Name); 

你也可以用它代替中WriteXML()

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

無論哪種方式,SH烏爾德給你:

<?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); 
} 

有什麼問題嗎?

編輯:但是你可能需要太開始和結束的元素,他們應該去的目標方法內:

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