C#类序列化

时间:2013-11-15 10:33:50

标签: c# xml serialization xml-serialization xmlserializer

我正在开发一个从对象生成xml文件的小应用程序。 我已经在主题中阅读了文章和许多其他内容,到目前为止,一切都进行了 好。 但是,当我想初始化更多相同类型的实例时,我就是不能这样做。

这是基类:

    public class manifest
{
    public metaObject meta { get; set; }
    public optionsObject options { get; set; }
    public datasourcesObject datasources { get; set; }
    public usersObject users { get; set; }        
}

我可以很好地制作对象,我也可以添加一些数据:

manifest manifestobjektum = new manifest
        {
            meta = new metaObject
            {
                  ... // it's OK
            },

            options = new optionsObject
            {
                  ... // it's OK
            },

            datasources = new datasourcesObject
            {
                  .. // It's OK
            },
            users = new usersObject
            {
                 user = new userObject
                {
                  .. // it's OK
                }
            }
        };

        XmlSerializer serializer = new XmlSerializer(typeof(manifest));
        serializer.Serialize(File.Create("testXMLfaszomat.xml"), manifestobjektum);

现在的问题是: 我想创建更多的用户对象(不知道多少),我该如何修改代码来实现这个目标呢? (users对象必须包含更多用户实例) 我认为这是一件容易的事情,我无法弄明白。

2 个答案:

答案 0 :(得分:1)

要存储未知数量的对象实例,您可以使用List

因此,要添加更多用户,您的课程将变为:

public class manifest
{
    public metaObject meta { get; set; }
    public optionsObject options { get; set; }
    public datasourcesObject datasources { get; set; }
    public List<usersObject> users { get; set; }        
}

您可以将初始化更改为以下内容:

users = new List<usersObject>
{
    new userObject(),
    new userObject(),
    new userObject()
}

序列化程序可以正确处理List,因此没有什么可以改变这些行。 您可能还想在类中添加一个初始化List的构造函数:

public manifest()
{
    user = new List<userObject>
}

因此您可以稍后添加用户,而无需在类初始化中明确地执行此操作。 例如,现在可以使用:

manifest someManifest = new manifest();
someManifest.users.Add(new userObject());


作为旁注,您应该考虑将UpperCamelCase用于您的类名和属性(manifest将成为Manifest),这是C#中非常常见的惯例。 / p>

答案 1 :(得分:0)

所以我要创建的XML表单:

<manifest>
 <meta>
 </meta>

 <option>
 </option>

 <datasource>
 </datasource>

 <users>
   <user>
   </user>
...
   <user>
   </user>
 </users>
</manifest>

为了实现这个目的,我创建了manifestObject:

public class manifest
{
    public metaObject meta { get; set; }
    public optionsObject options { get; set; }
    public datasourcesObject datasources { get; set; }

    public usersObject users { get; set; }
}

usersObject看起来像:

public class usersObject
{
    public List<userObject> user { get; set; }
}

但是当我尝试将数据填充到班级时:

users = new usersObject
{
  user = new List<userObject>
  {

   }
}

VS不提供该类的任何字段,因此它没有看到它。 我真的不知道出了什么问题,现在脑子里一片混乱。 :)