Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#XmL序列化-将项设置为属性仅显示XmL中的整数_C#_Xml - Fatal编程技术网

C#XmL序列化-将项设置为属性仅显示XmL中的整数

C#XmL序列化-将项设置为属性仅显示XmL中的整数,c#,xml,C#,Xml,我有一个满是建筑对象的列表,我想把它序列化为一个XML文件。基本序列化工作正常,但将值转换为属性以获得更好的可读性在除int值之外的所有值上都会出现奇怪的失败 以下是我正在使用的应序列化的building类: public class building { [XmlAttribute] public string strName { set; get; } //name [XmlAttribute] public in

我有一个满是建筑对象的列表,我想把它序列化为一个XML文件。基本序列化工作正常,但将值转换为属性以获得更好的可读性在除int值之外的所有值上都会出现奇怪的失败

以下是我正在使用的应序列化的building类:

    public class building
    {
       [XmlAttribute]
       public string strName { set; get; }    //name
       [XmlAttribute]
       public int intCount { set; get; }      //count of building
       [XmlAttribute]
       public int intCost { set; get; }       //running cost of building
       [XmlAttribute]
       public string strProd { set; get; }    //product
       [XmlAttribute)]
       public string strRes1 { set; get; }    //first ressource required
       [XmlAttribute]
       public string strRes2 { set; get; }    //second ressource required
       [XmlAttribute]
       public int intTime { set; get; }       //time to build in seconds
    }
如果省略[XMLAttribute]标记,则XML文件输出如下:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfBuilding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <building>
    <strName>Holzfäller</strName>
    <strKind>Produktion</strKind>
    <intCost>2</intCost>
    <strProd>Holz</strProd>
    <strRes1 />
    <strRes2 />
    <intTime>105</intTime>
  </building>
但这也只是让绳子发出噗噗声,根本不出现

在这件事上有点迷路了。如果我只保留属性内容,那么一切都正常,因此我至少可以确定我的代码的其余部分没有引起任何问题。但为什么XMLSerializer会忽略作为字符串的对象属性并重置所有int值呢?我怎样才能改变这个


很抱歉,如果有人问我这个问题,我找不到合适的词来帮助谷歌解决我的问题。主要是因为我不明白这里发生了什么,也不知道从哪里开始。我发现的文档只是显示我在做什么,声称它会起作用。但它显然不存在:-(

您的
字符串
为空,所以它们不是用序列化编写的

building
的默认构造函数中将字符串字段初始化为
string.Empty
,它们将出现在输出中

我在
建筑
中用这个构造函数测试了它:

public building()
{
    strProd = "";
}
输出:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfBuilding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <building intCount="0" intCost="0" strProd="" intTime="0" />
  <building intCount="0" intCost="0" strProd="" intTime="0" />
</ArrayOfBuilding>

为什么行为的属性不同?


Xml能够通过省略内容在元素中显示可为null的类型。但是,属性不能显示可为null的内容,也不能与空字符串区分开来。因此,该属性被完全省略。

尝试指定属性的类型。已经尝试过了,字符串仍然会被简单地取消。对不起,我忘了提及这一点。编辑我的帖子就是为了反映这一点。如果你想在很大程度上提高可读性,你应该从属性中删除类型前缀,并将类型信息存储在架构中。我不确定我是否理解你。为什么我的字符串为空?我理解,有些是空的,因为在我的示例中,有些建筑不需要外部资源。但大多数字符串根本不是空的。名称字段总是在那里,就像strProd字段总是有值一样。另外,如果我使用构造函数,strProd将始终是“”,即使它应该是“Holz”对于第一个构建。我不希望空属性只是为了看到它们在那里……值也需要正确。对于构造函数,属性显示为tho,这是一个好迹象。我无法在看不到其余代码的情况下评论字符串为什么为空。默认情况下字符串初始化为空。关于XML:XML属性为空默认情况下是可选的。请记住,格式是用于数据传输的,而不是用于表示。当属性为空时删除属性可以减少文件大小-这是一个值得追求的目标!可以说,您应该尽可能将日期保留在元素中。实际上,到目前为止,代码还没有太多。现在我有了包含上述元素的XML。我是extrac从那个XML中提取,并将这些对象放在我的列表中。然后,我尝试将它放在另一个XML中,就像第一次一样,只是用属性代替元素。我想,如果我没有意外地找到解决方案,我只会坚持使用元素。让它更易于阅读不是一个要求。这个问题的目标是从中学习一些东西西卡利。我不认为这是一个如此重要的问题,我只想错过一些显而易见的事情。谢谢你的回答!@Rattenmann随时都可以。希望你从讨论中得到一些东西。
public building()
{
    strProd = "";
}
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfBuilding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <building intCount="0" intCost="0" strProd="" intTime="0" />
  <building intCount="0" intCost="0" strProd="" intTime="0" />
</ArrayOfBuilding>