使用Serialize在Xml中保存多个项目

时间:2012-02-17 17:54:09

标签: c# xml-serialization

我将onject保存到xml文件中,序列化如下:

        FileStream stream = new FileStream(tempFilename,FileMode.Create);
        XmlSerializer serializer = new XmlSerializer(newType);
        serializer.Serialize(stream,objectname);

但是使用这个代码,我可以在我的xml文件中输入一个项目,如果我在其中插入新项目,它将被覆盖。我可以在我的文件中输入多个项目吗?Sholud我使用列表吗?

3 个答案:

答案 0 :(得分:2)

我经常这样做。我通常使用顶级类将集合属性封装为成员,并与xml文件具有一对一的关系。该类的成员可以是集合或简单属性等。

以下是包含自定义对象集合的代码段:

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlRootAttribute(ElementName = "DeployRuns", Namespace = "", IsNullable = false)]
public class DeployRuns : List<RunDetail>
{

然后,如果您想将您的集合封装在另一个将被序列化的类中,请参阅此类的bottom属性:

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public class DeployDetails
{
   public DeployDetails()
   {
      this.DeployRuns = new DeployRuns();
   }

   [System.Xml.Serialization.XmlAttributeAttribute("sourcePath")]
   public string SourcePath { get; set; }

   [System.Xml.Serialization.XmlAttributeAttribute("archiveDestinationPath")]
   public string ArchiveDestinationPath { get; set; }

   [System.Xml.Serialization.XmlAttributeAttribute("databaseDestinationPath")]
   public string DatabaseDestinationPath { get; set; }

   public DeployRuns DeployRuns { get; set; }
}

为了完成代码示例,这里是我的顶级类:

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlRootAttribute(ElementName = "ExecutionHistory", Namespace = "", IsNullable = false)]
public class ExecutionHistory
{
   public ExecutionHistory()
   {
      this.CaptureDetails = new CaptureDetails();
      this.DeployDetails = new DeployDetails();
   }

   [XmlElementAttribute("CaptureDetails", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
   public CaptureDetails CaptureDetails { get; set; }

   [XmlElementAttribute("DeployDetails", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
   public DeployDetails DeployDetails { get; set; }

答案 1 :(得分:1)

如果要将多个项目序列化为文件,请使用List<T>数据结构。

请注意T所代表的类型(类)必须标记为[XmlRoot]作为类属性或实现IXmlSerializable

答案 2 :(得分:0)

您可以创建List类型的对象,然后根据需要添加任意数量的“objectname”。然后将该List传递给序列化。