C# 序列化多个对象

C# 序列化多个对象,c#,xml,serialization,C#,Xml,Serialization,我的序列化代码如下 public class slab { public int lowerlimit {get; set;} public int upperlimit { get; set; } public int percentage { get; set; } } public class Details { static void Main(string[] args) { slab s= new slab();

我的序列化代码如下

public class slab
{
    public int lowerlimit {get; set;}
    public int upperlimit { get; set; }
    public int percentage { get; set; }

}

public class Details
{
    static void Main(string[] args)
    {
        slab s= new slab();
        s.lowerlimit = 0;
        s.upperlimit = 200000;
        s.percentage = 0;
        XmlSerializer serializer = new XmlSerializer(s.GetType());
        StreamWriter writer = new StreamWriter(@"filepath");
        serializer.Serialize(writer.BaseStream, s);
    }
}
它工作正常,我得到的输出文件如下:

<?xml version="1.0"?>
<slab xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <lowerlimit>0</lowerlimit>
    <upperlimit>200000</upperlimit>
    <percentage>0</percentage>
</slab>

0
200000
0
但是如何序列化多个对象呢?我想得到一个输出文件作为

<slabs>
    <slab>
        <lowerlimit>0</lowerlimit>
        <upperlimit>200000</upperlimit>
        <percentage>0</percentage>
    </slab>
    <slab>
        <lowerlimit>200000</lowerlimit>
        <upperlimit>500000</upperlimit>
        <percentage>10</percentage>
    </slab>
    <slab>
        <lowerlimit>500000</lowerlimit>
        <upperlimit>1000000</upperlimit>
        <percentage>20</percentage>
    </slab>
    <slab>
        <lowerlimit>1000000</lowerlimit>
        <upperlimit>0</upperlimit>
        <percentage>30</percentage>
    </slab>
</slabs>

0
200000
0
200000
500000
10
500000
1000000
20
1000000
0
30

您可以使用以下代码

List<Slab> listSlabs = new List<Slab>();
//add Slab to listSlabs
List listsplates=new List();
//将楼板添加到列表楼板

您可以序列化列表。

实际上,所需的输出格式不是有效的XML,因为XML文件总是需要单个根元素。您可以将
slab
s放入一个列表(
list slab=new list();
)并将其序列化,但您可能会得到这样的输出:

<slabs>
    <slab>
    <lowerlimit>0</lowerlimit>
    <upperlimit>200000</upperlimit>
    <percentage>0</percentage>
    </slab>

    <slab>
    <lowerlimit>200000</lowerlimit>
    <upperlimit>500000</upperlimit>
    <percentage>10</percentage>
    </slab>

    <slab>
    <lowerlimit>500000</lowerlimit>
    <upperlimit>1000000</upperlimit>
    <percentage>20</percentage>
    </slab>

    <slab>
    <lowerlimit>1000000</lowerlimit>
    <upperlimit>0</upperlimit>
    <percentage>30</percentage>
    </slab>
</slabs>

0
200000
0
200000
500000
10
500000
1000000
20
1000000
0
30
编辑
序列化的另一种方式可以是这样,告诉序列化程序有关根元素的更多信息:

List<Slab> slabs = new List<Slab>();
slabs.Add(...);

XmlSerializer serializer = new XmlSerializer(slabs.GetType(), new XmlRootAttribute("slabs"));
StreamWriter writer = new StreamWriter(@"filepath");
serializer.Serialize(writer.BaseStream, slabs);
List slab=new List();
加上(…);
XmlSerializer serializer=新的XmlSerializer(slaps.GetType(),新的XmlRootAttribute(“slaps”);
StreamWriter writer=新的StreamWriter(@“文件路径”);
serializer.Serialize(writer.BaseStream,slab);

为了更好地封装并确保类型名称,您可以创建一个名为slab的新对象,该对象只包含一个
列表
。将板添加到此新对象并将其序列化。

使用

XmlSerializer serializer = new XmlSerializer(**slabs**.GetType(), new XmlRootAttribute("slabs"));
而不是

XmlSerializer serializer = new XmlSerializer(s.GetType(), new XmlRootAttribute("slabs"));

将它们放在一个数组中并序列化数组…slab s=new slab();板s2=新板();列表板。添加(s);列表板。添加(s2);这样?工作很好:-)。但我没有得到家长标签作为。我越来越喜欢。我如何更改它?如果我在另一个类中编写它,我的主类(在其中向slab添加项)无法找到“slab”。我对我的答案做了更多更改,以便它与您现有的代码保持一致。