【问题标题】:C# class serializingC# 类序列化
【发布时间】:2013-11-28 17:21:58
【问题描述】:

我正在开发一个从对象生成 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);

现在的问题是: 我想创建更多的用户对象(不知道多少),我应该如何修改代码来实现这个? (用户对象必须包含更多用户实例) 我觉得这很容易,我就是想不通。

【问题讨论】:

  • 向我们展示 usersObject 的定义,以便我们知道您如何处理用户。它可能应该是一个 userObject 列表
  • 不确定我是否正确,但您不能将userObject 类中的user 对象设为List<userObject> 吗?或者更好的是,直接创建一个List<userObject>,而不是usersObject。然后,您可以添加一个 XML 序列化属性,指定您有一个列表。
  • 你的意思是喜欢在你的usersObject 班级里有List<userObject> 吗?您可以这样做,序列化程序将能够处理它
  • 实际上我有一个 XML 文件的确切形式,我想制作一个创建完全相同 xml 的应用程序。所以给出格式: ...

标签: c# xml serialization xml-serialization xmlserializer


【解决方案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# 中非常常见的约定。

【讨论】:

  • 是的,但在很多情况下我只需要用户。如果我创建一个清单列表,整个对象将重复,不是吗? (顺便感谢名字的建议:))
  • @Mhorpheus 哦!我想我读错了你的问题。所以你想在你的清单中添加更多的“用户”实例,而不是更多的清单?
  • @Mhorpheus 更新了我的答案,它现在应该真正回答你的问题了。很抱歉造成误解。
  • 我创建了用户对象(只是一个容器 obj)并且我想创建一个用户 obj 列表,所以输出应该是这样的: ... ... 如果我将代码更改为: users = new usersObject { user = new List { ... } } 但是如果我尝试使用它方式,对于 userObject 中的每个属性,我都会收到以下错误:'System.Collection.Generic.List ' does not contain a definition for... 也许是一些权限失败?
【解决方案2】:

所以我要创建的 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 不提供类中的任何字段,因此它看不到它。 我真的不知道怎么了,现在脑子里一片混乱。 :)

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 2021-12-17
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多