string> Dictionary<字符串;enumerator在Unity3D中停止在某些Android设备上提

本文关键字:Android Unity3D Dictionary gt 字符串 string enumerator | 更新日期: 2023-09-27 17:50:52

我们在某些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序列化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字典流的简化)…

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,> -我们对Dictionary<String,>,它们继续返回预期的枚举数类型。尽管我们在整个游戏流程中进行了大量测试和日志记录,但我们仍无法确定在哪里会出现故障,因为它似乎在协同程序的更新之间出现故障。

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

这个问题是由一个看起来无害的数据更改引入的,它改善了我们的日文字符支持,所以我们怀疑它暴露了一个存在的问题。

我们已经通过修复Json库的字典解析来解决这个问题,以支持这个新情况,但我们更担心是什么导致了这个潜在的问题,以及它可能导致的其他问题,我们还没有注意到。

有没有人看到类似的问题在方式字典或其他集合类的行为改变像这样,或有建议,我们如何能进一步追踪是什么导致的问题?

string> Dictionary<字符串;enumerator在Unity3D中停止在某些Android设备上提

当涉及到IEnumerator与MonoBehaviour时,有很多问题。在我们公司的整个职业生涯中,我至少管理过10个这样的项目。

它会抛出你和对象异常。系统。废话连篇。但重点是,MonoBehaviour类。对它的许多类没有添加函数。这就是你得到这个错误的原因。

我们做的第一步是用继承了MonoBehaviour的IEnumerator类来分隔类。

如果MonoBehaviour用IEnumerator实例化类。你一定会遇到这个问题的。

现在你可以测试这是否是真正的问题。尝试unhinretting MonoBehaviour,你会看到IEnumerator没有错误。当然你会有一个关于GameObject之类的错误。但这只是为了理解问题。

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

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

这个答案只是导致问题的原因的扩展,但要解决你的问题。您要么需要避免将IEnumerator从MonoBehaviour类继承中反序列化。或者考虑使用没有Add()调用的Array