我正在创建一个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;
答案 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
值,将从您的序列化结果中完全省略。