2009-10-07 71 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,而不是空白?這似乎是最可能的解釋...

相關問題