我有一个WebService,我正在维护,在.Net 2.0上运行。它使用原始的“asmx”文件标准进行一系列Web服务。在这些Web服务中,返回的某些对象可能具有大量“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 :(得分:3)
XmlElementAttribute.IsNullable Property
如果IsNullable属性为false,则不会为已设置为空引用的类成员生成XML元素(在Visual Basic中为Nothing)。
public class MyClass
{
[XmlElement(IsNullable = false)]
public string Group;
}
答案 1 :(得分:2)
示例xml令人困惑,因为在大多数情况下,序列化程序将省略空值,尤其是对于属性。与元素一起使用时,例外是Nullable<T>
,例如:
[XmlElement("job")]
public int? Job { get; set; }
可能导致:
<user ...>
<job xsi:nil="true" />
</user>
非常与您的示例xml不同。在一般情况下,可以使用多种方法控制序列化:
IsNullable
[XmlElement]
属性
[DefaultValue]
public bool ShouldSerialize{propname}() {...}
方法[XmlIgnore] public bool {propname}Specified {get {...} set {...}}
属性然而;如果没有可重复的示例来运行您的示例,则无法完全回答。
更新更新的问题; 这个应该可以实现这一点,但不清楚这些其他属性是什么(如果为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
}
答案 2 :(得分:0)
从架构的角度来看,您实际上是在说这些元素是可选的,这可以通过使用DefaultValue属性来实现(至少根据文档)。见http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmldefaultvalue.aspx
答案 3 :(得分:0)
你确定
GetColumnValue<string>("Username");
返回null而不是空白?这似乎是最可能的解释......