Как safly проверить неинициализированное значение из десериализации - PullRequest
1 голос
/ 15 апреля 2019

Я создаю класс DataContract для десериализации из строки.Я прочитал какую-то статью и узнал, что я могу написать метод OnDeserialized, который будет вызываться после десериализации, прежде чем вернуть объект.Вот как это выглядит в моем классе.

Работает нормально, если какой-либо член НЕ находится в потоке.Как бы то ни было, у меня вопрос в том случае, если член НЕ находится в потоке, кто может гарантировать, что эти неинициализированные значения равны 0, DateTime.MinValue и null соответственно?

Кроме того, если член int имеет значениеиз 0, откуда я знаю, что он из потока или не инициализирован?

[DataContract]
public class MyData
{
    [DataMember]
    public int MemberA { get; set; }

    [DataMember]
    public DateTime MemberB { get; set; }

    [DataMember]
    public string MemberC { get; set; }

    [OnDeserialized]
    void OnDeserialized(StreamingContext c)
    {
        if (MemberA == 0)
            MemberA = 100;
        if (MemberB == DateTime.MinValue)
            MemberB = DateTime.Now;
        if (MemberC == null)
            MemberC = "MemberC";
    }
}

Я ищу лучший подход, что-то вроде

if (NotInitialized(MemberA))
    MemberA = xxx;

1 Ответ

2 голосов
/ 16 апреля 2019

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

[DataMember]
public int? MemberA { get; set; }

[DataMember]
public DateTime? MemberB { get; set; }

[DataMember]
public string? MemberC { get; set; }

Обратите внимание на добавление ? к каждому типу значения, которое указывает, что оно также может быть null.

Чтобы легко определить, имеют ли они значения:

if (MemberA.HasValue)
{
    // Value = MemberA.Value;
    ... do something
}

Вы также можете убедиться, что член не выводится, если снова сериализовать класс с использованием атрибутов DataMember:

[DataMember(IsRequired = false, EmitDefaultValue = false)]
public int? MemberA { get; set; }

Это означает, что MemberA будет полностью исключен из ваших сериализованных результатов, если он имеет значение null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...