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 ライブラリの辞書解析を修正することで問題を簡単に解決しましたが、この根本的な問題の原因と、まだ気付いていない他の問題を引き起こしている可能性についてもっと心配しています.

ディクショナリまたは他のコレクション クラスの動作がこのように変更された方法で同様の問題を見た人はいますか、または問題の原因をさらに追跡する方法について提案がありますか?

4

1 に答える 1

0

MonoBehaviour を使用した IEnumerator に関しては、多くの問題があります。私は、当社でのキャリア全体で、少なくとも 10 件は実行してきました。

それはあなたとオブジェクト例外をスローします。システム。何とか何とか何とか。しかし要点は、MonoBehaviour クラスです。そのクラスの多くに追加機能がありません。そのため、このエラーが発生しています。

私たちが行った応急処置は、MonoBehaviour を継承する IEnumerator クラスでクラスを分離することです。

MonoBehaviour が IEnumerator を使用してクラスをインスタンス化する場合。あなたはこの問題を抱えているに違いありません。

これが本当の問題であるかどうかをテストする前に、今すぐ確認してください。MonoBehaviour のヒンレットを解除してみると、IEnumerator に関するエラーがないことがわかります。もちろん、GameObject などに関するエラーが発生します。しかし、これは問題を理解するためのものです。

次に、IEnumerator は、MonoBehaviour または List、Dictionary、またはそれらへの Add 呼び出しを持つ GenericType にとって問題となるためです。

代わりに配列にすることにしました。特に XML デシリアライズと jSon 呼び出しで。

この回答は、問題の原因の延長に過ぎませんが、問題を解決するためのものです。MonoBehaviour クラスの継承から、逆シリアル化、IEnumerator を回避する必要があります。または、Add() 呼び出しを持たない Array の使用を検討してください。

于 2015-03-29T05:17:53.967 に答える