Сохранение в JsonUtility
Описание
Создал у себя такой класс:
public class Homework
{
public DateTime Date;
public string Title, Description;
}
Сериализовал с помощью атрибута System.Serializable, создал список из этого класса и сохранил с помощью JSON.
PlayerPrefs.SetString("Homeworks", JsonUtility.ToJson(new Container(Data)))
...где Container класс, который содержит в себе список из классов Homework.
private class Container
{
public List<Homework> Homeworks;
public Container(List<Homework> Input)
{
Homeworks = Input;
}
}
Сохраняется всё кроме поля Date (предполагаю что оно не сериализовано), но так как эта структура создано не мною, атрибут System.Serializable не помогает.
Дополнение
Поискал в интернете Как сериализовать системную структуру. Результаты только о том как сериализовать собственную структуру.
Тогда как мне сериализовать структуру DateTime или же если это невозможно то как сохранить поле Date?
Ответы (1 шт):
Ответ дан участником EvgeniyZ
Жить станет намного легче если для этой цели использовать библиотеку Newtonsoft.Json. Разницу вы сразу же заметите на примере...
До
Чтобы сохранить / загрузить всё это мы используем различные фокусы, причём структура Date так и не будет сохранится:
using System;
using System.Collections.Generic;
using UnityEngine;
public class Global: MonoBehaviour
{
[Serializable]
public class Homework
{
public DateTime Date;
public string Title, Description;
}
private class Container
{
public List<Homework> Homeworks;
public Container(List<Homework> Input)
{
Homeworks = Input;
}
}
public static class Homeworks
{
public static List<Homework> Data = new List<Homework>();
private static readonly string DataPath = "data";
public static void Save()
{
PlayerPrefs.SetString(DataPath, JsonUtility.ToJson(new Container(Data)));
}
public static void Load()
{
if(!PlayerPrefs.HasKey(DataPath))
{
Data = new List<Homework>();
}
else
{
Data = JsonUtility.FromJson<Container>(PlayerPrefs.GetString(DataPath)).Homeworks;
}
}
}
}
После
Теперь всё это ясно и коротко с помощью Json.Net:
using System.IO;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
public class Global: MonoBehaviour
{
public class Homework
{
public DateTime Date;
public string Title, Description;
}
public static class Homeworks
{
public static List<Homework> Data = new List<Homework>();
private static readonly string DataPath = Path.Combine(Application.dataPath, "data.json");
private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
public static void Save()
{
File.WriteAllText(DataPath, JsonConvert.SerializeObject(Data, Settings));
}
public static void Load()
{
if (!File.Exists(DataPath))
{
Data = new List<Homework>();
}
else
{
Data = JsonConvert.DeserializeObject<List<Homework>>(File.ReadAllText(DataPath));
}
}
}
}
Плюсы библиотеки
- Сохраняется абсолютно всё
- Без сериализации
- Без лишних классов такие как
Container - Маленький размер (1.4 мб)