Значение по умолчанию для DataMember Emit - PullRequest
4 голосов
/ 04 мая 2011

У меня есть функция веб-службы .Net, которая может принимать одну строку.

Эта функция затем сериализует эту строку в JSON, но я хочу сериализовать ее, только если ее значение не равно "".

Я нашел эти инструкции:

http://msdn.microsoft.com/en-us/library/aa347792.aspx

[DataContract]
public class MyClass
{
   [DataMember (EmitDefaultValue=false)]
   public string myValue = ""
}

К сожалению, я не могу скрыть myValue от сериализации, потому что "" не является значением .Net по умолчанию для строки (насколько это глупо!)

Произошел один из двух вариантов

  1. В веб-сервисе есть какой-то атрибут, который устанавливает "" в ноль

  2. Имеются некоторые условия для класса

Я бы предпочел 1-й, потому что он делает код чище, но мнение было бы здорово.

Спасибо

Ответы [ 2 ]

6 голосов
/ 02 июля 2013

Вы можете явно установить значение по умолчанию (для целей сериализации), используя класс DefaultValueAttribute:

[DataContract]
public class MyClass
{
    [DataMember (EmitDefaultValue=false)]
    [DefaultValue("")]
    public string myValue = ""
}
0 голосов
/ 26 апреля 2012

Я думаю, у вас есть хотя бы пара вариантов здесь.Это дополнительная работа, но она того стоит.

  • Вы можете инкапсулировать строку в ссылочный тип.Поскольку ссылочные типы являются нулевыми, если они отсутствуют, это позволяет сразу узнать, присутствовала или нет строка (поскольку инкапсулирующий ссылочный тип будет либо ненулевым, либо нулевым, если строка не пустая или нет.)

  • Последний вариант, который у вас есть, - это добавить дополнительную дополнительную переменную (возможно, логическую), которая установлена ​​в OnDeserializing / OnDeserialized / OnSerializing / OnSerialized, и использовать ее для отслеживания того, действительно ли что-то присутствовалона проводе.Например, вы можете установить для этой дополнительной переменной значение true, только когда вы на самом деле сериализуете непустую строку и аналогично

...