我们在某些 Android 设备(Nexus 10、Galaxy Note 3(SM-N9005、SM-N9000Q)、Galaxy Tab、S4(SGH-I337、SGH-M919、GT-I9505)上使用 C# 和 JsonFX 在 Unity3D 中遇到问题, Galaxy Note 10.1 (SM-P600, SM-P601), HTC One)。
在我们的应用程序开始时,任何使用 JsonFX 序列化的 Dictionary< string, string > 都会正确生成一个字符串,但在某些时候会损坏,从那时起将抛出带有以下消息的 JsonSerializationException:
Error JsonSerializationException: Types which implement Generic IDictionary<TKey, TValue> must have an IEnumerator which implements IDictionaryEnumerator. (System.Collections.Generic.Dictionary`2[System.String,System.String])
经过调查,我们发现在一些未知事件之前,以下代码(这是 JsonFX Dictionary 流程的简化)......
var myDictionary = new Dictionary<string, string> {
{ "key1", "value1" },
{ "key2", "value2" },
};
IEnumerator enumerator = ((IEnumerable)((IDictionary)myDictionary)).GetEnumerator();
IDictionaryEnumerator dictionaryEnumerator = enumerator as IDictionaryEnumerator;
...成功获得以下类型的字典枚举器:
System.Collections.Generic.Dictionary`2+Enumerator[[System.String, mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Dict Enumerator Path 1 = System.Collections.Generic.Dictionary`2+Enumerator[[System.String, mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]
一旦被破坏,它就无法获得字典枚举器,因为返回的枚举器是以下类型:
System.Collections.Generic.Dictionary`2+KeyCollection[System.String,System.String]
有趣的是,我们尝试在开始时构建一个字典并通过我们的游戏流程重新测试同一个实例,即使在这种情况下,它也会在错误发生后停止可序列化。
值得注意的是,这只会中断 Dictionary< string, string > - 我们正在使用 Dictionary< string, object > 运行相同的测试,并且它们继续返回预期的枚举数类型。尽管在我们的整个游戏流程中进行了乱扔测试和日志记录,但我们无法准确确定它在哪里损坏,因为它似乎在协程更新之间中断。
我们尝试在错误前后转储加载的程序集以尝试捕获依赖项更改版本,但没有区别。
这个问题是由一个看起来很单纯的数据变化引入的,它改善了我们对日语字符的支持,所以我们怀疑它暴露了一个现有的问题。
我们已经通过修复 Json 库的字典解析来支持这个新案例来轻松解决这个问题,但我们更担心是什么导致了这个潜在问题,以及它可能导致的其他什么我们还没有注意到的问题。
任何人都在 Dictionary 或其他集合类行为的变化方式中看到类似的问题,或者对我们如何进一步追踪导致问题的原因提出建议?