【问题标题】:Serialize multiple objects into XML将多个对象序列化为 XML
【发布时间】:2015-09-17 11:15:58
【问题描述】:

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

【问题讨论】:

  • 您反复覆盖同一个文件,因此您的文件最终包含最后一项,序列化列表,而不是一次一个。
  • @YaelBS 我在你的回答中写了一条评论

标签: c# xml-serialization


【解决方案1】:

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

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

【讨论】:

  • valuesList.Add(value) 中的 valuesList 是什么;你的意思是 valuesList 吗?将其替换为 valuesList 后给我一个错误,不包含 Add 方法
  • 关于 valuesList 如果我想添加由 valuesList 命名的值列表?
  • 刚刚最后的评论怎么用valuesList.valuesList.AddRange(SomeotherValueList)怎么用那个
  • 请注意,您在此答案中从 OP 代码中所做的一项重要更改是在 foreach 循环中初始化 value 对象。否则,代码会创建对同一 value 对象的多个引用。我认为说出来很重要。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 2021-05-03
      相关资源
      最近更新 更多