如何通过反序列化检查未初始化的值

时间:2019-04-15 20:54:23

标签: c# serialization

我正在创建一个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 个答案:

答案 0 :(得分:2)

您可以考虑使用可为空的类型,如果在反序列化过程中丢失数据,该类型将自动设置为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值,将从您的序列化结果中完全省略。