将多个对象序列化为XML

时间:2015-09-17 11:15:58

标签: c# xml-serialization

我尝试使用以下代码将我的对象序列化为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();

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

填充列表的第一个foreach循环会反复覆盖相同的value对象,并重复向List添加对同一对象的新引用。当您致电valus.Add(value);时,您实际上并未在列表中添加新项目。

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

答案 2 :(得分:0)

首先让我们验证您的类是否可以串行化,如下所示:

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