2009-10-07 40 views
3

我有一个我维护的WebService,运行在.Net 2.0上。它使用一系列Web服务的原始“asmx”文件标准。在这些Web服务中,返回一些可能具有大量“空”值的对象。例如:asmx服务可以返回什么而不是null吗?

<user id="1" name="foo" job="null" location="null" audience="null" /> 

这是一个简单的例子;在现实中,我们有更多的“空值”值。由于我不需要拥有这些空值,因为我可以很容易地推断出它们不存在,所以我宁愿不返回它们。这可以做到吗?如果是这样,怎么样?

编辑补充类定义:

[Serializable] 
public partial class User 

    [XmlAttribute("Id")] 
    public int Id 
    { 
     get { return GetColumnValue<int>("ID"); } 

     set { SetColumnValue("ID", value); } 

    } 



    [XmlAttribute("Username")] 
    public string Username 
    { 
     get { return GetColumnValue<string>("Username"); } 

     set { SetColumnValue("Username", value); } 

    } 
} 

顺便说一句,是我的目标看到的是:

<user id="1" name="foo" /> 
+0

请显示class User的定义。使用默认设置时,如果序列化为属性(即使用'[XmlAttribute]'),则在输出XML中应忽略所有属性(如果它们为null)。 –

+0

根据您的示例进行了更新,但仍不清楚这些额外属性是什么 - 即仍无法验证它是否正常工作/损坏。 –

回答

2

该示例xml令人困惑,因为在大多数情况下,串行器忽略空值,特别是对于属性。

[XmlElement("job")] 
public int? Job { get; set; } 

可能导致:

<user ...> 
    <job xsi:nil="true" /> 
</user> 

这又是你的示例XML很不同的元素一起使用时,例如例外是Nullable<T>。在一般情况下,可以使用多种方法来控制序列:

  • [XmlElement]
  • 添加[DefaultValue]
  • 添加public bool ShouldSerialize{propname}() {...}方法
  • 添加[XmlIgnore] public bool {propname}Specified {get {...} set {...}}属性
  • IsNullable属性

然而;没有可重复的例子来运行你的例子,这是不可能完全回答。


重新更新的问题; 应该做到这一点,但它不清楚这些其他属性是什么(如果你不想显示null)。

[Serializable, XmlRoot("user")] 
public partial class User 
{ 
    [XmlAttribute("id")] 
    public int Id {get;set;} // snipped more complex property implementation 
    [XmlAttribute("name")] 
    public string Username {get;set;} // ditto 
} 
+0

这是最完整的答案;事实证明,还有一些其他因素导致所有的空值,而不仅仅是web服务(一个JSON转换层,它分析了它“预期”在那里并插入了空值)。我要在这里给出信用,因为这在技术上是正确的。谢谢马克。 – jvenema

3

XmlElementAttribute.IsNullable Property

如果IsNullable属性是假的,没有为已经设置为空引用的类成员(在Visual Basic中为Nothing)生成XML元素。

public class MyClass 
{ 
    [XmlElement(IsNullable = false)] 
    public string Group; 
} 
+0

优秀;我会试试这个。没有办法在全球范围内设置,但是,呃? – jvenema

+0

好的,这样仍然返回前半部分(作业=部分),用“”代替“null”。任何其他想法? – jvenema

+2

你可以发布你正在被序列化的类定义吗? –

0

确定

GetColumnValue<string>("Username"); 

被返回null,而不是空白?这似乎是最可能的解释...

相关问题