Необязательные поля с DataContractJsonSerializer (как изменить значение по умолчанию) - PullRequest
0 голосов
/ 11 сентября 2018

Я успешно использовал DataContractJsonSerializer для сериализации объекта в json.Самое замечательное в этом то, что я могу работать с необязательными полями (которые могут или не могут быть сериализованы).Например,

[DataContract()]
public class aClass
{
  [DataMember()]
  public int member1;
  [DataMember()]
  public int member2;
  [DataMember(EmitDefaultValue=false)]
  public int member3;
}

В этом случае, когда я создаю экземпляр объекта класса aClass, я могу установить member1 равным 1, а member 2 равным 2, а member3 равным 3. Когда я сериализую его, яполучить соответствующую строку JSON.С другой стороны, если я устанавливаю только member1 и member2, сериализатор игнорирует member3 при генерации строки JSON.Это очень полезно и работает не только в целых числах, но и в списках, объектах и ​​т. Д.

Теперь я не пробовал, но я думаю, что сериализатор будет игнорировать member3 не только тогда, когда он не установлен, но и когдаустановить по умолчанию (в случае int по умолчанию будет 0).Поэтому, пока member3 равен 1, 2 или 3, он сериализуется.Пока что это было желаемое поведение.

Вот моя проблема.

Я хотел бы, чтобы member3 был сериализован, когда установлено значение 0 , или 1, 2, 3. И не сериализовано иначе.(например, когда не установлено)

Возможно ли это вообще?Как этого достичь?

1 Ответ

0 голосов
/ 02 ноября 2018

Я наконец нашел способ сделать то, что я просил.Да, сначала я сделал хак, чтобы иметь возможность сериализовать 0, но это был хак, связанный с сохранением других переменных (bool setTo0=false), но потом я обнаружил, что есть более простой способ.

Он использует Обнуляемые типы .Когда вы объявляете int как обнуляемый тип, он будет сериализовать его, даже если для него задано значение по умолчанию 0. Единственный раз, когда он не будет сериализовать его, это когда изначально установлено значение null (да, для int в этом случае может быть установлено значение Null),

...