【问题标题】:Why XmlSerializer.Order do this为什么 XmlSerializer.Order 这样做
【发布时间】:2012-10-24 18:22:54
【问题描述】:

谁能解释为什么我得到下面的结果?

应该实例化的类:

[System.SerializableAttribute()]
public class SampleClass
{
    [System.Xml.Serialization.XmlElementAttribute(Order = 10)]
    public string Foo { get; set; }
    [System.Xml.Serialization.XmlElementAttribute(Order = 5)]
    public string Bar { get; set; }
}

用于反序列化的XML:

<?xml version="1.0" encoding="utf-8" ?>
<SampleClass>
  <Foo>Test1</Foo>
  <Bar>Test2</Bar>
</SampleClass>

我在反序列化的类中看到 Foo = Test1(正确)和 Bar = null(不正确)。

这都是关于Order 属性的。它被故意设置为错误的值。如果值为 0 和 1,则一切正常。

Name 和 Order 两个字段的条件都不匹配,但由于某种原因,一个字段被反序列化,而第二个字段没有。我宁愿看到 Exception 或两个值 = null 或两个字段都已解析和反序列化。

对此有什么解释吗?

【问题讨论】:

  • 您是故意这样做的吗? XmlSerializer(Order = 10)
  • 没有 XmlSerializer 属性。
  • 你的问题是:我故意做错了,但想知道为什么它的行为与我的预期不同?
  • CodeIgnoto:谢谢。我固定了样本。它是我的代码中的 XmlElementAttribute。
  • 您可能想看看这篇文章,它解释了为什么会发生这种情况并提供解决方案 - webservices20.blogspot.com/2009/01/…

标签: c# .net serialization xml-serialization


【解决方案1】:

您确实看到了一个序列化错误。

这真的归结为设计偏好。开发人员决定他们不想except 并中止整个反序列化过程,而是通知并继续。

使用您的 XML。

<?xml version="1.0" encoding="utf-8" ?>
<SampleClass>
  <Foo>Test1</Foo>
  <Bar>Test2</Bar>
</SampleClass>

考虑使用此代码对其进行反序列化。

XmlSerializer xs = new XmlSerializer(typeof(SampleClass));

XmlDeserializationEvents events = new XmlDeserializationEvents();
events.OnUnknownAttribute = (sender, e) => Debug.WriteLine("Unknown Attributed");
events.OnUnknownElement = (sender, e) => Debug.WriteLine("Unknwon Element");
events.OnUnknownNode = (sender, e) => Debug.WriteLine("Unknown Node");
events.OnUnreferencedObject = (sender, e) => Debug.WriteLine("Unreferenced Object");

SampleClass cs_de = (SampleClass)xs.Deserialize(XmlReader.Create(new StringReader(xml)), events);

Debug.WriteLine(cs_de.Foo);
Debug.WriteLine(cs_de.Bar);

当我使用正确的顺序时。

[System.Xml.Serialization.XmlElementAttribute(Order = 0)]
public string Foo { get; set; }
[System.Xml.Serialization.XmlElementAttribute(Order = 1)]
public string Bar { get; set; }

我的输出是

Foo
Bar

当我使用不正确的顺序时。

[System.Xml.Serialization.XmlElementAttribute(Order = 10)]
public string Foo { get; set; }
[System.Xml.Serialization.XmlElementAttribute(Order = 5)]
public string Bar { get; set; }

我的输出是

Unknown Node
Unknwon Element
Foo

那么为什么Foo 会打印出来?好吧,我的理解是 Order 是 NOT 索引。 Ordering 仅指定 Foo 需要出现在 Bar 之前,而不是 Foo 需要是第 10 个元素,Bar 需要是第 5 个元素。我认为这使反序列化器更加灵活。

【讨论】:

  • 感谢您的帮助。这部分回答了我的问题。仍在寻找另一部分的答案 - 你知道为什么 Foo 被反序列化,即使它的 Order 错误(与 Bar 相同)。我希望看到更一致的行为(两个字段都失败)。
  • @DmitryHarnitski 在底部查看我的编辑。我看不出它是如何不一致的,只是不符合您的预期。
  • 评论仍然没有解释结果。两个元素都指定了顺序。 Class 中的字段数量等于 XML 中元素的数量。所以结果应该是 Bar = Test1(因为 5 在 10 之前)和 Foo = Test2
  • 但是Bar 不能是Test1,因为元素&lt;Bar&gt; 的值是Test2。元素名称与您的类中的属性名称相对应。
  • 但 Bar 不能是 Test1 - 应该是按照顺序。 Test1 是 XML 中第一个元素的值,Bar 字段的 Order 值最低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2010-12-17
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多