C# 将多个对象序列化为XML

C# 将多个对象序列化为XML,c#,xml-serialization,C#,Xml Serialization,我尝试使用以下代码将对象序列化为xml文件,但运行此代码时,列表中的最后一项将被列表的计数序列化 我想序列化列表中的每个项目?我的代码有什么问题 有人能帮我吗 //list of class values List<values> valus = new List<values>(); values value = new values(); foreach (Control control in Controls) { value

我尝试使用以下代码将对象序列化为xml文件,但运行此代码时,列表中的最后一项将被列表的计数序列化

我想序列化列表中的每个项目?我的代码有什么问题

有人能帮我吗

//list of class values               
List<values> valus = new List<values>();
values value = new values();

foreach (Control control in Controls)
{
    value.ctrlname = control.Name.ToString();
    value.ctrllocation = control.Location.ToString();
    value.ctrltext = control.Text.ToString();
    value.ctrltype = control.GetType().ToString();
    value.ctrlstatus = control.Enabled.ToString();

    valus.Add(value);    
}

System.Xml.Serialization.XmlSerializer writer =
       new System.Xml.Serialization.XmlSerializer(typeof(values));

var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//Serialization.xml";
System.IO.FileStream file = System.IO.File.Create(path);

foreach (values item in valus)
{
    writer.Serialize(file, item);
}

file.Close();
//类值列表
列表值=新列表();
值=新值();
foreach(控件中的控件)
{
value.ctrlname=control.Name.ToString();
value.ctrllocation=control.Location.ToString();
value.ctrltext=control.Text.ToString();
value.ctrltype=control.GetType().ToString();
value.ctrlstatus=control.Enabled.ToString();
增值(增值);
}
System.Xml.Serialization.XmlSerializer编写器=
新的System.Xml.Serialization.XmlSerializer(typeof(value));
var path=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)+“//Serialization.xml”;
System.IO.FileStream file=System.IO.file.Create(路径);
foreach(值中的值项)
{
序列化(文件、项);
}
file.Close();

write.Serialize可能每次都会覆盖文件中的内容,而不是追加内容。您可以尝试将值序列化为以下问题中的字符串:。然后手动将字符串值追加到文件


或者,您可以一次序列化整个列表,而不是每个值。

write.serialize可能每次都会覆盖文件中的内容,而不是追加内容。您可以尝试将值序列化为以下问题中的字符串:。然后手动将字符串值追加到文件


或者,您可以序列化整个列表,而不是一次序列化每个值。

填充列表的第一个foreach循环将重复覆盖相同的
对象,并向列表中重复添加对相同对象的新引用。当您调用
valus.Add(value)时,实际上并没有向列表中添加新项目


尝试移动行
values value=new values()
到foreach循环的顶部,或者,如果您特别担心多次声明对象的效率,请保留行
在循环外部,并添加行
value=newvalues()填充列表的第一个foreach循环将重复覆盖相同的
对象,并向列表中重复添加对相同对象的新引用。当您调用
valus.Add(value)时,实际上并没有向列表中添加新项目


尝试移动行
values value=new values()
到foreach循环的顶部,或者,如果您特别担心多次声明对象的效率,请保留行
在循环外部,并添加行
value=newvalues()在foreach循环中。

首先让我们验证您的类是可序列化的,如下所示:

[Serializable()]
public class rootValues
{
    public rootValues()
    {
        valuesArray = new List<values>(); 
    }

    [XmlElement("item", typeof(values))]
    public List<values> valuesList { get; set; }
} 

[Serializable()]
public class values
{
    [System.Xml.Serialization.XmlAttribute("ctrlname")]
    public string ctrlname { get; set; }

    //....
} 
仅供参考,如果您想添加
类值列表
,您可以这样做:

//...
List<values> SomeListOfvalues =  new List<values>(); 

// Init list
SomeListOfvalues.add(new values()); // Adding first element
SomeListOfvalues.add(new values()); // Adding second element

// Adding the whole list to our class
valuesList.valuesList.addRange(SomeListOfvalues );
/。。。
List SomeListOfvalues=新列表();
//初始化列表
SomeListOfvalues.add(新值());//添加第一个元素
SomeListOfvalues.add(新值());//添加第二个元素
//将整个列表添加到我们的课堂
valuesList.valuesList.addRange(一些值列表);

首先让我们验证您的类是可序列化的,如下所示:

[Serializable()]
public class rootValues
{
    public rootValues()
    {
        valuesArray = new List<values>(); 
    }

    [XmlElement("item", typeof(values))]
    public List<values> valuesList { get; set; }
} 

[Serializable()]
public class values
{
    [System.Xml.Serialization.XmlAttribute("ctrlname")]
    public string ctrlname { get; set; }

    //....
} 
仅供参考,如果您想添加
类值列表
,您可以这样做:

//...
List<values> SomeListOfvalues =  new List<values>(); 

// Init list
SomeListOfvalues.add(new values()); // Adding first element
SomeListOfvalues.add(new values()); // Adding second element

// Adding the whole list to our class
valuesList.valuesList.addRange(SomeListOfvalues );
/。。。
List SomeListOfvalues=新列表();
//初始化列表
SomeListOfvalues.add(新值());//添加第一个元素
SomeListOfvalues.add(新值());//添加第二个元素
//将整个列表添加到我们的课堂
valuesList.valuesList.addRange(一些值列表);

您重复覆盖同一文件,因此您的文件最终包含最后一项,请序列化列表,而不是一次一项。@YaelBS我在您的回答中写了一条注释您重复覆盖同一文件,因此您的文件最终包含最后一项,请序列化列表,不是每一项都一次完成。@YaelBS我在你的回答中写了一条评论什么是valuesList in valuesList.Add(value);你是说贵重物品清单吗?在将其替换为valuesList后,给我一个错误not contain Add method About valuesList如果我想添加valuesList命名的值列表?仅最后一条注释如何使用
valuesList.valuesList.AddRange(其他一些ValueList)
如何使用它请注意,您在回答OP的代码时所做的一个重要更改是初始化foreach循环中的
对象。否则,代码将创建对同一
值的多个引用。我认为这一点很重要。什么是valuesList in valuesList。添加(值);你是说贵重物品清单吗?在将其替换为valuesList后,给我一个错误not contain Add method About valuesList如果我想添加valuesList命名的值列表?仅最后一条注释如何使用
valuesList.valuesList.AddRange(其他一些ValueList)
如何使用它请注意,您在回答OP的代码时所做的一个重要更改是初始化foreach循环中的
对象。否则,代码将创建对同一
值的多个引用。我认为把这件事说出来很重要。