我想问一下我得到的以下行为 - 使用 v3 (BSD) 或 v4 - 是否是一个错误。
我有一个通用列表。我使用 myList.ToJson() 对其进行序列化。结果我得到了这个:
"[{\"__type\":\"MyNameSpace.MyType, MyAssembly\", ... (properties)},
{... (properties)},
{... (properties)},
{... (properties)},
...]"
也就是说,只有第一个元素的类型被写入。结果,当我这样做时:
var deserialised = myList.ToJson().FromJson<List<object>>();
我得到一个列表,它的第一个元素是 MyType 和作为后续元素的字符串。我知道:
FromJson<List<MyType>>()
有效,但我不知道编译时的类型。我有两个问题:
- 这是一个错误吗?
- 如果没有,有没有办法在没有动态解析开销的情况下解决它(即 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 之前的值应该在所有属性写入之后恢复,也就是在同一个方法结束之前。谁能证实这一点?