1


我的 XML 序列化程序有一个奇怪的行为。
在读取 XML 并将其反序列化为对象后,所有属性都设置为其默认值,而不是 xml 文件中声明的值。
序列化程序不会抛出异常并正常运行。xml 文件格式正确并适合类结构。
任何人都知道这是怎么回事,或者我怎么能找到问题的根源?
谢谢

编辑:我没有告诉你整个故事。问题是,我得到的 XML 来自另一个组件。我能够反序列化 XML 文件,现在我得到了不同的格式。由于该文件大约有 3000 行,我无法发布整个代码。但这里有区别:可
反序列化:

<?xml version="1.0" encoding="utf-8"?>
<rootElem xmlns:cfg="namespace1" xmlns:office="namespace2" xmlns="namespace3">
<Prop1 xmlns="">6</Prop1>
<Prop2 xmlns="">string</Prop2>
</rootElem>

不可反序列化

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rootElem xmlns:cfg="namespace1" xmlns:office="namespace2" xmlns="namespace3">
<Prop1>6</Prop1>
<Prop2>string</Prop2>
</rootElem>

我真的不明白为什么我可以解组第一个示例,因为每个元素中都有 xmlns 标记,为什么我不能解组第二个示例......

edit2:刚刚意识到只有顶级元素有这些奇怪的 xmlns="" 属性。但是 C# 类声明与所有其他类没有什么不同……这很奇怪。

C# 类是这样的:

using namespace1;

namespace namespace3
{
  [System.SerializableAttribute()]
  [System.ComponentModel.DesignerCategoryAttribute("code")]
  [System.Xml.Serialization.XmlTypeAttribute(Namespace="namespace3")]
  [System.Xml.Serialization.XmlRootAttribute(Namespace="namespace3", IsNullable=true)]
  public partial class rootElem: BaseObject
  {
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public int Prop1
    {
      //...
    }
  }
}
4

2 回答 2

1

一个具体的例子(都是 c# ad xml)在这里会有很长的路要走。最有可能是以下之一:

  • 名称不是 xml 和 c# 之间的精确(区分大小写)匹配(允许通过属性等进行名称覆盖)
  • xml 属性/元素之间存在混淆
  • xml 命名空间存在差异(通常存在于 xml 中而在 c# 中缺失)

通过您的编辑,它变得更加清晰。XML 命名空间非常重要;<foo xmlns="abc"/>并且<foo/>完全不相关。此外,xml 命名空间是继承的,所以在:

<rootElem xmlns:cfg="namespace1" xmlns:office="namespace2" xmlns="namespace3">
<Prop1>6</Prop1>
<Prop2>string</Prop2>
</rootElem>

正是这种情况,Prop1并且Prop2位于namespace3它们从父级继承的命名空间中。为了让 c# 清楚地知道您希望它们位于子命名空间(而不是空命名空间)中,请告诉它

[Serializable]
[DesignerCategory("code")]
[XmlType(Namespace = Namespace3)]
[XmlRoot(Namespace = Namespace3, IsNullable = true)]
public partial class rootElem
{
    private const string Namespace3 = "namespace3"; // to avoid repetition

    [XmlElement(Namespace = Namespace3)]
    public int Prop1 { get; set; }
}
于 2012-07-26T07:08:32.527 回答
0

经过进一步调查,我能够找到问题所在。我仍然不明白为什么序列化程序的行为方式如此。据我了解命名空间的声明你必须定义没有前缀的“xmlns”属性来设置默认命名空间(W3Schools)。正如我的问题中所述,它被定义(除了其他命名空间):

<rootElem xmlns:cfg="namespace1" xmlns:office="namespace2" xmlns="namespace3">

由于根元素的所有直接子元素都(再次)声明了 xmlns 属性,我的解释是找不到默认命名空间。
所以我所做的是明确地为根元素定义一个命名空间,以便像这样生成根元素:

<root:rootElem xmlns:cfg="namespace1" xmlns:office="namespace2" xmlns:root="namespace3">

瞧,正确生成了 xml(从直接子项中删除了 xmlns 属性)并且序列化程序能够读取数据。
但仍然存在一些问题:

  • 为什么序列化程序没有使用默认命名空间正确生成 xml?
  • 如果序列化程序无法读取数据并将其放入我的实例中,我预计会出现异常(为什么要创建一个“空”实例)
于 2012-07-27T06:50:38.233 回答