Могут ли службы asmx ничего не возвращать вместо нуля? - PullRequest
3 голосов
/ 07 октября 2009

У меня есть веб-сервис, который я поддерживаю и работающий на .Net 2.0. Он использует оригинальный файловый стандарт «asmx» для ряда веб-сервисов. В этих веб-сервисах возвращаются некоторые объекты, которые могут иметь большое количество «нулевых» значений. Например:

<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 ]

3 голосов
/ 07 октября 2009

Свойство XmlElementAttribute.IsNullable

Если свойство IsNullable имеет значение false, элемент XML не создается для членов класса, для которых установлена ​​нулевая ссылка (Nothing в Visual Basic).

public class MyClass
{
   [XmlElement(IsNullable = false)]
   public string Group;
}
2 голосов
/ 12 октября 2009

Пример 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 {...}} свойства

Тем не менее, без повторяемого примера, с которым можно сравнить ваш пример, невозможно ответить полностью.


Re обновленный вопрос; это должно выполнить это, но не ясно, каковы эти другие свойства (которые вы не хотите показывать, если ноль).

[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 голосов
/ 12 октября 2009

Вы уверены, что

 GetColumnValue<string>("Username"); 

возвращает ноль и не пусто? Это кажется наиболее вероятным объяснением ...

0 голосов
/ 11 октября 2009

С точки зрения схемы вы фактически говорите, что элементы являются необязательными, этого можно достичь (по крайней мере, в соответствии с документацией) с помощью атрибута DefaultValue. Смотри http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmldefaultvalue.aspx

...