【问题标题】:Can XmlSerializer.Deserialize ever return null?XmlSerializer.Deserialize 可以返回 null 吗?
【发布时间】:2010-09-15 14:01:57
【问题描述】:

我一直在尝试以几种不同的方式让 XmlSerializer.Deserialize 返回 null 然而这似乎不可能

我尝试了一个为 null、格式错误的 xml、格式正确的 xml 的类。

我可能在这里遗漏了一些明显的东西,但有可能吗?

为了澄清给出一个可序列化的 MyClass 类,我希望通过与以下类似的测试

[Fact] //this is a the test attribute when using xUnit
public void When_xml_Something_Then_serialize_returns_null()
{
    string serializedObject = "<?xml version=\"1.0\" encoding=\"utf-8\"?><MyClass xmlns:xsi=\"http://www.w3asdsadasdasd.org/2001/XMLSchema-instance\"></MyClass>";
    using (var stringReader = new StringReader(serializedObject))
    {
        Assert.Null(new XmlSerializer(typeof(MyClass)).Deserialize(stringReader));
    }
}

在序列化字符串中尝试了不同的东西,我要么得到一个异常,要么得到一个 MyClass 的空实例 :( 谢谢 注意:这个问题有一个错字,现在更正了

注意 2:有关更详细的答案,请查看 cmets。

【问题讨论】:

  • 你指的是哪种方法? XmlSerializer.Serialize 返回 void,所以不可能返回 null。
  • 该死,我的意思是反序列化
  • 那么你是怎么让你过去的单元测试的?

标签: c# serialization xml-serialization


【解决方案1】:

是的,Deserialize 可以在输入不包含预期的 XML 时返回 null。这在 XML 名称空间混淆时经常出现。如果输入包含具有预期名称的根元素,但位于不同的命名空间中,则将返回 null。

这在处理 ASMX Web 服务或 Web 引用时经常出现,尤其是针对 RPC 样式服务的 Web 引用,其中消息是根据消息的 XSD type 而不是根据element.

【讨论】:

  • 在命名空间上尝试了一些不同的东西,上面的测试失败了,有什么线索吗?
  • 添加了这一点,如果我将 xmlns= 从示例更改为它抛出的任何其他内容,则会出现格式错误的异常。我认为它一定是这样的,所以我接受你的回答是有效的
  • 您能显示包含xmlns 的XML 元素吗?我担心它会引发异常。
  • @Miau:您应该尝试使用StringReader 来加载XmlDocument,以查看XML 文档中是否实际上可能没有错误。然后发布完整的异常,包括任何 InnerException 实例。
  • @Miau:XML 序列化器是用 .NET 1.0 编写的,早在代码合同之前。除了可能修复严重的安全漏洞之外,它在未来不太可能发生变化。
【解决方案2】:

显然,您可以viewdownload .NET 框架的 System.Xml 部分的代码。这使您可以查看源代码以确定它何时返回 null。

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 2016-10-17
    • 2010-11-10
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多