2014-03-19 164 views
3

上一些Android設備提供接口應用中旬我們正在使用C#和JsonFX某些Android設備經歷Unity3D的問題(的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)。詞典<字符串,字符串>枚舉停止在Unity3D

在我們的應用程序的啓動任何字典<字符串,字符串>連載使用JsonFX將正確生成一個字符串,但在某些時候變得壞了,從此會拋出一個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] 

有趣我們已經嘗試在開始時構建一個字典,並通過我們的遊戲流程重新測試相同的實例,即使在這種情況下,它也會在發生錯誤後停止序列化。

值得注意的是,這隻對字典<打破字符串,字符串> - 我們與字典<字符串,對象>運行相同的測試,他們繼續返回預期的枚舉類型。儘管在我們的遊戲流程中進行了亂拋垃圾的測試和日誌記錄,但我們無法確切地確定,其中這變得中斷,因爲它似乎在協程的更新之間斷開。

我們試過的bug前後傾倒加載的程序集,試圖趕上依賴性變化版本,但沒有差異。

這個問題已經由一個無辜的看着數據出臺只能改變,所以我們懷疑其暴露的現有問題,它提高了我們的日文字符的支持。

我們通過修復Json庫的字典解析來支持這個新案例,但我們更擔心導致這個潛在問題的原因以及它可能導致我們沒有注意到的其他問題然而。

任何一個在有道詞典的或其他集合類的行爲改變了這個樣子,或者有建議我們如何進一步追查什麼原因造成的問題,看到了類似的問題?

+0

同樣的問題在這裏,沒有解決方案呢。奇怪的是,它似乎取決於設備,不一定是Android操作系統版本。仍在調查... – derFunk

+0

今天我一直在使用MiniJSON和脫機字節碼選項(Unity Pro)有類似的問題。關於這個問題的更多信息:http://forum.unity3d.com/threads/168019-quot-System-String-doesn-t-implement-interface-System-Collections-IEnumerator-quot-crash – frarees

+0

感謝@farees的鏈接。有趣的是,他表示它是由iOS AOT問題引起的,因爲我意識到這些問題(因爲它還經歷了一個隨機的實時問題),但我們能夠排除它,因爲它只在Android設備上發起,而不是使用AOT。 – Sassy

回答

0

當涉及到MonoBehaviour的IEnumerator時,存在很多問題。我在我公司的職業生涯中已經有至少10名員工參加。

它會引發你和對象異常。系統。等等等等等等。但重點是,MonoBehaviour Class。沒有爲其許多類添加函數。這就是你得到這個錯誤的原因。

,我們做的急救是與MonoBehaviour繼承一個IEnumerator類來分隔類。

如果MonoBehaviour使用IEnumerator實例化類。你的約束有這個問題。

現在你可以測試這是否是真正的問題。嘗試unhinretting MonoBehaviour,你會發現IEnumerator沒有錯誤。當然你會有關於GameObject等的錯誤。但這只是爲了理解這個問題。

接下來,由於IEnumerator對於MonoBehaviour或List,Dictionary或任何具有向它們添加調用的GenericType都有些問題。

我們決定把它變成一個數組。特別在XML反序列化和jSon調用中。

此答案只是導致問題的原因的延伸,但解決您的問題。您或者需要避免反序列化,IEnumerator超出MonoBehaviour類的繼承。或者考慮使用沒有Add()調用的Array。

相關問題