C# 字典<;字符串,字符串>;enumerator停止在Unity3D中的某些Android设备上提供界面mid应用程序

C# 字典<;字符串,字符串>;enumerator停止在Unity3D中的某些Android设备上提供界面mid应用程序,c#,android,dictionary,unity3d,jsonfx,C#,Android,Dictionary,Unity3d,Jsonfx,我们在某些Android设备(Nexus 10、Galaxy Note 3(SM-N9005、SM-N9000Q)、Galaxy Tab、S4(SGH-I337、SGH-M919、GT-I9505)、Galaxy Note 10.1(SM-P600、SM-P601)、HTC One)上使用C#和JsonFX的Unity3D出现问题 在我们的应用程序开始时,任何使用JsonFX序列化的Dictionary都将正确生成一个字符串,但在某个点上会断开,从那时起将抛出JsonSerializationE

我们在某些Android设备(Nexus 10、Galaxy Note 3(SM-N9005、SM-N9000Q)、Galaxy Tab、S4(SGH-I337、SGH-M919、GT-I9505)、Galaxy Note 10.1(SM-P600、SM-P601)、HTC One)上使用C#和JsonFX的Unity3D出现问题

在我们的应用程序开始时,任何使用JsonFX序列化的Dictionary都将正确生成一个字符串,但在某个点上会断开,从那时起将抛出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])
一旦中断,它将无法获取字典枚举数,因为返回的枚举数类型为:

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——我们正在对Dictionary运行相同的测试,它们会继续返回预期的枚举数类型。尽管在整个游戏流程中进行了垃圾测试和日志记录,但我们仍然无法准确地确定这会在何处被破坏,因为它似乎会在协同程序的更新之间被破坏

我们已经尝试在bug之前和之后转储加载的程序集,以尝试捕获一个依赖项更改版本,但没有区别

这个问题是由一个外观纯正的数据更改引起的,它提高了我们对日语字符的支持,因此我们怀疑它暴露了一个现有的问题

我们通过修复Json库的字典解析来解决这个问题,以支持这个新案例,但我们更担心是什么导致了这个潜在问题,以及它可能导致哪些我们尚未注意到的其他问题


有没有人在Dictionary或其他集合类的行为发生这样的变化时看到过类似的问题,或者有人建议我们如何进一步追踪导致问题的原因?

对于使用MonoBehavior的IEnumerator,有很多问题。在我们公司的整个职业生涯中,我至少经营过10家这样的公司

它将抛出您和对象异常。系统。废话废话。但问题是,单一行为类。它的许多类都没有Add函数。这就是为什么你会犯这个错误

我们所做的第一件事是用一个IEnumerator类来分离这个类,该类通过monobhavior继承

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

现在,您可以测试这是否是真正的问题。尝试取消设置MonoBehavior,您将看到IEnumerator没有错误。当然,你会有一个关于游戏对象之类的错误。但这只是为了理解问题

其次,由于IEnumerator对于单行为或列表、字典或任何具有添加调用的GenericType来说都是一个问题

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


这个答案只是导致问题的原因的延伸,只是为了解决你的问题。您需要避免将IEnumerator反序列化到MonoBehavior类继承之外。或者考虑使用没有Addio-()调用的数组。

这里有相同的问题,还没有解决方案。奇怪的是,它似乎依赖于设备,而不一定是Android操作系统版本。还在调查…今天我在使用MiniJSON和strip字节码选项(Unity Pro)时遇到了类似的问题。关于这个问题的更多信息:谢谢@Fares的链接。有趣的是,他建议这是由iOS AOT问题引起的,因为我知道这些问题(也经历了随机的实时问题),但我们能够排除它,因为它只发生在不使用AOT的Android设备上。
System.Collections.Generic.Dictionary`2+KeyCollection[System.String,System.String]