将多个对象序列化为 XML

Serialize multiple objects into XML

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

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

谁能帮帮我?

//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();

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

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

您填充列表的第一个 foreach 循环重复覆盖相同的 value 对象并向列表重复添加对相同对象的新引用。当您调用 valus.Add(value);.

时,您实际上并没有在列表中添加新项目

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

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

[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 of class values               
rootValues valusList = new rootValues();

foreach (Control control in Controls)
{
    values value = new values(); // Create new element, in your code it was the same

    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();

    valuesList.valuesList.Add(value);    
}

System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(rootValues));
var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//Serialization.xml";
System.IO.FileStream file = System.IO.File.Create(path);
writer.Serialize(file, valusList);
file.Close();

仅供参考,如果您想添加 class values 的列表,您可以这样做:

//...
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 );