特定の 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 ライブラリの辞書解析を修正することで問題を簡単に解決しましたが、この根本的な問題の原因と、まだ気付いていない他の問題を引き起こしている可能性についてもっと心配しています.
ディクショナリまたは他のコレクション クラスの動作がこのように変更された方法で同様の問題を見た人はいますか、または問題の原因をさらに追跡する方法について提案がありますか?