v3 (BSD) または v4 のいずれかで発生する次の動作がバグであるかどうかを尋ねたいと思います。
一般的なリストがあります。myList.ToJson() を使用してシリアル化します。その結果、私はこれを得る:
"[{\"__type\":\"MyNameSpace.MyType, MyAssembly\", ... (properties)},
{... (properties)},
{... (properties)},
{... (properties)},
...]"
つまり、最初の要素だけにその型が書き込まれます。その結果、これを行うと:
var deserialised = myList.ToJson().FromJson<List<object>>();
最初の要素として MyType を持ち、後続の要素として文字列を持つリストを取得します。そんなこと知ってる:
FromJson<List<MyType>>()
動作しますが、コンパイル時の型がわかりません。2 つの質問があります。
- これはバグですか?
- そうでない場合、動的解析 (つまり、JsConfig.IncludeTypeInfo) のオーバーヘッドなしで回避できる方法はありますか?
上記の理由は次のとおりです。
JsState.IsWritingDynamic = false;
で:
if (WriteTypeInfo != null || JsState.IsWritingDynamic)
{
if (JsConfig.PreferInterfaces && TryWriteSelfType(writer)) i++;
else if (TryWriteTypeInfo(writer, value)) i++;
JsState.IsWritingDynamic = false;
}
の:
WriteType<T, TSerializer>.WriteProperties
この行は、2012 年 9 月 12 日に 067ce1f62fc6addd3685a2134dd576529db2549f に追加され、プロパティのタイプ自体が削除されました。IsWritingDynamic の以前の値は、すべてのプロパティの書き込み後、つまり同じメソッドが終了する前に復元する必要があると思います。誰でもこれを確認できますか?