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