我有很多这样的记录:
[<DataContract>]
type Rec1 = {
[<DataMember>] mutable field1 : int;
[<DataMember>] mutable field2 : string;
}
[<DataContact>]
type Rec2 = {
[<DataMember>] mutable field3 : Rec1;
[<DataMember>] mutable field4 : int;
}
我使用
DataContactJsonSerializer
将JSON反序列化为以下结构。 这是一个有效的JSON值:{ "field3": null, "field4": 1 }
这意味着在运行时,
field3
是 null/Unchecked.defaultOf<_>
。在 Visual Studio 2010 中,这个测试正常工作:(deserialize<Rec2> "{ field3: null, field4: 1 }") = { field3 = Unchecked.defaultOf<_>; field4 = 1 } //true
在Visual Studio 2013中,相同的代码会抛出一个“NullReferenceException”异常:
at Rec2.Equals(Rec2 obj)
在查看ILSpy中的代码时,我发现它是自动生成的:
if(this != null)
{
return obj != null && this.field3.Equals(obj.field3) && this.field4.Equals(obj.field4);
}
return obj == null;
因为DataContractJsonSerializer将值设置为null,所以编译器假设field3从不为null,这是问题的关键。我尝试将AllowNullLiteral属性应用于Rec1,但F#记录不允许应用该属性。我该如何告诉编译器字段可以为null或者重新构造我的类型使其可行?