2015-03-11 2 views
2

В моей Unity3D игре у меня есть следующий словарь:ExecutionEngineException: Попытка метода JIT компиляции 'System.Collections.Generic.Dictionary'

public Dictionary<string, List<UpgradeData>> upgradeList; 

где UpgradeData очень простой класс:

public class UpgradeData 
{ 
    public bool lockStatus; 
    public bool purchased; 

} 

Я читал here о том, что вы не можете использовать типы значений в качестве словарных ключей, но насколько я знаю, укуса не является типом значений. Поэтому проблема должна исходить из использования List в качестве значения словаря. Любая идея, как обойти это. Код работает как на платформе Windows, так и на MacOS. Я пытаюсь сериализовать этот Словарь с помощью бинарного форматирования. Я имел аналогичные проблемы с сериализации других классов, но мне удалось исправить, добавив:

if (Application.platform == RuntimePlatform.IPhonePlayer) 
     { 
      System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes"); 
     } 

Что мне нужно сделать, чтобы сериализовать словарь?

Edit: Забыл включаемые весь класс, который работает со словарем

[Serializable] 
    public class CharacterUpgradeList 
    { 

     private UpgradeData[] _upgrade_Data; 
     private List<UpgradeData>[] upgData; 

     public Dictionary<string, List<UpgradeData>> upgradeList; 
     public CharacterUpgradeList() 
     { 
      upgData = new List<UpgradeData>[4]; 
      for (int i = 0; i < upgData.Length; i++) 
      { 
       upgData[i] = new List<UpgradeData> { 
         new UpgradeData(), 
         new UpgradeData(), 
         new UpgradeData(), 
         new UpgradeData(), 
         new UpgradeData(), 
         new UpgradeData() 
        }; 
      } 

      upgradeList = new Dictionary<string, List<UpgradeData>> 
     { 
      {"Man",upgData[0]}, 
      {"Woman",upgData[1]}, 
      {"Boy",upgData[2]}, 
      {"Girl",upgData[3]} 

     }; 
     } 
    } 

, а затем я создаю объект из вышеупомянутого класса в этом классе:

[Serializable] 
class GameData 
{ 
    public int _coinAmount, _upgradeLevel; 
    public Level_Data[] _level_Data; 
    public CharacterUpgradeList _charUpgradeList; 
    public SerialVector2 serialVector; 

    public GameData() 
    { 
     _charUpgradeList = new CharacterUpgradeList(); 
    } 

} 

и я пытаясь сериализовать GameData.

+0

Просто взглянув на это быстро, я подумал, что вы должны иметь возможность «сериализовать объект», который, как говорится, менял бы сигнатуру метода, чтобы сделать второй параметр объекта в основном путем литья 'upgradeList' примерно таким образом ' (IDictionary <строка, объект>) upgradeList' Я не уверен, как Mono справится с этим, но я знаю, что C# должен работать – MethodMan

+0

@MethodMan. Я сделал edin на своем исходном сообщении, возможно, вы можете взглянуть сейчас. –

+0

. В этом случае выглядит так: «Сериализовать» класс, в этом случае вы рассмотрели любые примеры здесь, на «Stackoverflow», здесь есть сайт, а также поиск в Google, вы можете дать рабочие примеры [Stackoverflow Serialize a class] (http://stackoverflow.com/questions/5937630/serialize-class-to-xml) – MethodMan

ответ

2

BinaryFormatter опирается на компиляцию JIT, которая не поддерживается в iOS. Проблема заключается не в ваших структурах данных, а в ограничениях функций платформы.

Вам понадобится использовать другую библиотеку сериализации, которая поддерживает полную компиляцию AOT. Мне повезло с JsonFx. Некоторые люди рекомендовали protobuf-net.

+0

Установив 'System.Environment.SetEnvironmentVariable (« MONO_REFLECTION_SERIALIZER »,« yes »);« Я смог использовать BinaryFormatter для всего остального. Мне нужно выяснить способ публикации сообщения об ошибке с Ipad. –

+0

Вы можете попробовать сериализовать более простые типы, которые вы сшиваете вместе, но в основном вы используете библиотеку, которая явно не поддерживается на целевой платформе. Я бы это исправил. – rutter

+0

@ruttwr yes Я перешел на использование protobuf-net, и теперь все работает лучше. Тем не менее, почему он только держит списки и словари –

Смежные вопросы