疲れすぎて幻覚を見ているのかもしれませんし、実際には C# + Mono に問題があるのかもしれません!!
class のメソッドに出くわしながら、 Json.Netでテストとデバッグを行っていました。このメソッドは、 という名前の別のプライベート メソッドを呼び出します。に渡された引数の 1 つは、タイプで呼び出されます。このオブジェクトは、メソッドに渡される前に値を取得し、その後は null です!!SetPropertyValue
JsonSerializerInternalReader
CalculatePropertyDetails
CalculatePropertyDetails
reader
JsonReader
CalculatePropertyDetails
ばかげているように聞こえるかもしれませんが、私は素朴ではないと信じていますが、そのような奇妙な行動を見るために何が起こったのでしょうか? 誰でも合理的な説明を思いつくことができますか? 私が知っているのは、このプロジェクトがマルチスレッドではなく、結果が再現可能であることだけです。
私が得た唯一の証拠は、コール スタックの一番上にある次の 2 つのエントリです。
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CalculatePropertyDetails (property={Id}, propertyConverter={JsonRpcTest.ObjectIdConverter}, containerContract={Newtonsoft.Json.Serialization.JsonObjectContract}, containerProperty=(null), reader=(null), target=(null), useExistingValue=false, currentValue=(null), propertyContract=(null), gottenCurrentValue=false) in Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs:792
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue (property={Id}, propertyConverter={JsonRpcTest.ObjectIdConverter}, containerContract={Newtonsoft.Json.Serialization.JsonObjectContract}, containerProperty=(null), reader={Newtonsoft.Json.JsonTextReader}, target={JsonRpcTest.E}) in Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs:750
引数を探しreader
ます。
私は Ubuntu 12.04、Mono 3.2.3、および Monodevelop 4.1.7 を使用しており、プロジェクトは を使用して開発されてMono / .Net 4.5
います。
[アップデート]
SetPropertyValue
whereが定義され、whereCalculatePropertyDetails
が呼び出されるコードの一部を次に示します。
private bool SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, object target)
{
object currentValue;
bool useExistingValue;
JsonContract propertyContract;
bool gottenCurrentValue;
if (CalculatePropertyDetails(property, ref propertyConverter, containerContract, containerProperty, reader, target, out useExistingValue, out currentValue, out propertyContract, out gottenCurrentValue))
return false;