0

IList をシリアライズしようとしています。したがって、これには IXmlSerializable を使用しています。クラスは次のとおりです。

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 からネストされたオブジェクトのシリアル化を呼び出すにはどうすればよいですか?

4

2 に答える 2

1

それはとても簡単に思えます:

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

問題はありますか?

編集:しかし、おそらく Start 要素と End 要素も必要になるでしょう。それらは Target メソッド内に配置する必要があります。

public void WriteXml(System.Xml.XmlWriter writer)
{
    writer.WriteStartElement("Target");
    writer.WriteString(Name);
    writer.WriteEndElement(); 
}
于 2012-01-20T12:15:33.850 に答える
1

@Henk Holterman のアドバイスに従えば、ターゲットの 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>
于 2012-01-20T12:34:40.480 に答える