代码之家  ›  专栏  ›  技术社区  ›  Jerod Venema

asmx服务可以不返回空值而返回任何值吗?

  •  3
  • Jerod Venema  · 技术社区  · 15 年前

    我有一个正在维护的WebService,运行在.NET 2.0上。它对一系列Web服务使用原始的“asmx”文件标准。在这些Web服务中,返回的某些对象可能具有大量“空”值。例如:

    <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" />
    
    4 回复  |  直到 15 年前
        1
  •  2
  •   Marc Gravell    15 年前

    示例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 {...}} 财产

    但是;没有 可重复的 举个例子来反证你的例子,是不可能完全回答的。


    重新回答更新后的问题; 应该做到这一点,但不清楚这些其他属性是什么(如果为空,则不显示)。

    [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
  •  3
  •   rick schott    15 年前

    XmlElementAttribute.IsNullable Property

    如果isNullable属性为false,则不会为已设置为空引用的类成员生成XML元素(在VisualBasic中为Nothing)。

    public class MyClass
    {
       [XmlElement(IsNullable = false)]
       public string Group;
    }
    
        3
  •  0
  •   Neal    15 年前

    从模式的角度来看,您实际上是在说元素是可选的,这可以通过使用defaultvalue属性来实现(至少根据文档)。见 http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmldefaultvalue.aspx

        4
  •  0
  •   cjk    15 年前

    你确定吗

     GetColumnValue<string>("Username"); 
    

    是否返回空值而不是空值?这似乎是最可能的解释…