Почему эти классы сериализуются в json из "{}" - PullRequest
1 голос
/ 12 марта 2020

У меня явно очень плохой день, я пробовал структуры и классы, поэтому, когда я использую единицы JsonUtility.To Json, я получаю только {}, когда знаю, что класс заполнен фактически 81 элементами массива.

[Serializable]
public struct PuzzleData
{
    public CellData[,] values;
}

[Serializable]
public struct CellData
{
    public int value;
    public bool isFixed;
}

Итак, я делаю это с:

var tmp = new PuzzleData();
tmp.values = new CellData[9, 9];
tmp.values[0,0]=1;
<more lines>
string json = JsonUtility.ToJson(tmp);
Debug.Log(json);

, но мой json остается "{}", но я знаю, что у класса есть данные, так как я также отправляю их в игру быть заполнены, и все данные появляются, как я его ввел. Класс JsonUtility говорит, что он будет работать с массивами сериализуемого типа, ну, это ... так что ...

Я знаю, что это массив, но я использовал массивы, но по общему признанию, раньше у меня были только эти входящие данные. , но, для жизни меня, я не могу понять, почему это не делает работу. (между прочим, когда класс конструктор позаботился о создании значений данных в ячейке), чтобы класс работал в любом случае в единстве, но просто не заставил работать бит json ...

1 Ответ

2 голосов
/ 12 марта 2020

Как уже упоминалось в комментариях @Trojanfoe, это связано с 2D-массивом, который не поддерживается сериализатором, на который опирается JsonUtility.ToJson.

И, пусть это будет довольно неясно, на самом деле это задокументировано. Если вы хотите go немного спуститься по кроличьей норе:

Из JsonUtility.ToJson документов (выделено мной):

Внутренне этот метод использует сериализатор Unity; поэтому передаваемый объект должен поддерживаться сериализатором : это должен быть MonoBehaviour, ScriptableObject или обычный класс / структура с примененным атрибутом Serializable. Типы полей, которые вы хотите включить, должны поддерживаться сериализатором; неподдерживаемые поля будут игнорироваться, как и частные поля, поля stati c и поля с примененным атрибутом NonSerialized.

Теперь это ничего не говорит о многомерных массивах ... Но если мы go к документам о сериализаторе сценариев и прокрутив немного вниз к небольшой заметке, мы найдем следующее (выделение мое):

Примечание: Unity делает не поддерживается сериализация многоуровневых типов ( многомерных массивов , зубчатых массивов и вложенных типов контейнеров). Если вы хотите сериализовать их, у вас есть два варианта: заключить вложенный тип в класс или структуру или использовать обратные вызовы сериализации ISerializationCallbackReceiver для выполнения настраиваемой сериализации. Для получения дополнительной информации см. Документацию по пользовательской сериализации.

SuperPig от Unity Technologies подтверждает это в сообщении на форуме здесь от 24 февраля 2016 г., в котором он также позднее заявляет

Они собираются появиться одновременно с Редактором, поддерживающим другие типы - однако это не обязательно «далеко» в будущем, так как мне нужно работать на сериализаторе для различных других функции, которые люди также хотят (например, поддержка словаря).

К сожалению, пока этого не произошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...