反序列化null

时间:2011-11-04 10:47:43

标签: c# wcf serialization

我有一个WCF REST Web服务,并且具有多个字符串属性的数据交换。我希望能够接受空值(如下所示),但是在合同中将属性设置为可空字符串(string?)会产生编译器错误。当我将datacontract属性保留为字符串时,它会在客户端向我发送xml时出错。它给出的错误是序列化错误。我试图做的是什么?

<myclass>
<somestring xsi:nil="true" />
<myclass>

2 个答案:

答案 0 :(得分:2)

  • 字符串不必被视为可空,因为它是引用类型而不是值类型,因此无论如何都可以为null。 string str = null;编译得很好。

  • 这不是有效的XML,但是可能导致运行时错误(不是编译时间)

试试这个

<myclass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <somestring xsi:nil="true" />
</myclass>

答案 1 :(得分:0)

您可以尝试省略元素或属性(我不记得WCF是否会接受此):

<myclass>
</myclass>

主要问题是您尚未定义xsi命名空间。假设myclass是文档的根目录:

<myclass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <somestring xsi:nil="true" />
</myclass>

请记住,xmlhttp://www.w3.org/XML/1998/namespace)和xmlnshttp://www.w3.org/2000/xmlns/)是XML默认提供的唯一名称空间和前缀。

您还可以使用XmlSerializerFormatAttribute并使用旧的System.Xml.Serialization实施 - 它确实识别http://www.w3.org/2001/XMLSchema-instance

更多信息

  • 我假设您使用XML示例写错了 - 请记住您的结束标记不正确。
  • String无法在Nullable<T>中使用,因为它不是值类型 - 您可以为其分配Null,因为它是引用类型。在String
  • 中使用DataContract