3

我们在某些 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 或其他集合类行为的变化方式中看到类似的问题,或者对我们如何进一步追踪导致问题的原因提出建议?

4

1 回答 1

0

IEnumerator 和 MonoBehaviour 存在很多问题。在我们公司的整个职业生涯中,我至少运行过 10 次。

它会抛出你和对象异常。系统。等等等等等等。但重点是 MonoBehaviour 类。它的许多类没有添加功能。这就是您收到此错误的原因。

我们所做的急救是将类与继承 MonoBehaviour 的 IEnumerator 类分开。

如果 MonoBehaviour 使用 IEnumerator 实例化该类。你肯定有这个问题。

现在,您可以测试这是否是真正的问题。尝试 unhinretting MonoBehaviour,你会发现 IEnumerator 没有错误。当然,您会遇到有关 GameObject 等的错误。但这只是为了理解问题。

接下来,由于 IEnumerator 对 MonoBehaviour 或 List、Dictionary 或任何对它们有 Add 调用的 GenericType 来说是个问题。

我们决定将其改为数组。特别是在 XML 反序列化和 JSON 调用中。

这个答案只是导致问题的原因的延伸,而是解决您的问题。您要么需要避免反序列化, IEnumerator 超出 MonoBehaviour 类继承。或者考虑使用没有 Add() 调用的 Array。

于 2015-03-29T05:17:53.967 回答