[첫 접근] ※ 이 코드는 잘못되었으니 더 아래 있는 [ 해결 ]의 소스를 참고하시면 됩니다.
UserData 클래스를 만들어 그 안에 한 명의 유저의 정보(이름, 나이, 직업, 결혼 여부, 주소 등)를 변수로 담는다.
DataBase 클래스를 만들어 UserData 타입의 List를 하나의 인자로 가진다.
이 DataBase 클래스를 Json으로 저장하여 내보낸다.
using UnityEngine;
public class UserData : MonoBehaviour
{
public string Name;
public string Age;
public string Job;
public string Married;
public string Address;
public void SetUserData(string name, string age, string job, string married, string address)
{
this.Name = name;
this.Age = age;
this.Job = job;
this.Married = married;
this.Address = address;
}
}
using System;
using System.Collections.Generic;
[Serializable]
public class DataBase
{
public List<UserData> dataList = new List<UserData>();
}
using System.IO;
using UnityEngine;
public class DataManager : MonoBehaviour
{
public DataBase data = new DataBase();
// SaveFile Path
string _filePath;
void Start()
{
_filePath = Application.persistentDataPath + "/" + "AddressDataBase.json";
}
public void Save()
{
string jData = JsonUtility.ToJson(data, true);
File.WriteAllText(_filePath, jData);
print("저장 완료");
print(_filePath); // 제대로 저장되었나 보기 위한 주소 확인용
}
public void LoadGameData()
{
if(File.Exists(_filePath))
{
string jData = File.ReadAllText(_filePath);
data = JsonUtility.FromJson<DataBase>(FromJsonData);
foreach (var user in data.dataList)
{
//나의 경우 주소록을 불러올때 정보를 담을 박스 오브젝트 프리팹에
//정보를 담아 인스턴스했다.
}
print("불러오기 완료");
}
}
}
[ 결과 ]
제대로 저장이 되지 않았다.
[ 원인 ]
찾아보니 List가 저장이 되지 않는다는 글들을 보았고 이에 대한 해결책들이 나와 있었다.
[ 해결 ]
//해결책이 된 소스
[System.Serializable]
public class Serialization<T>
{
public Serialization(List<T> _target) => target = _target;
public List<T> target;
}
한명의 데이터 클래스
using System;
[Serializable]
public class UserData
{
public string Name;
public string Age;
public string Job;
public string Married;
public string Address;
public void SetUserData(string name, string age, string job, string married, string address)
{
this.Name = name;
this.Age = age;
this.Job = job;
this.Married = married;
this.Address = address;
}
}
데이터를 관리할 클래스
public class DataManager : MonoBehaviour
{
AddressManager addressManager; //주소록 관리클래스
string filePath;
public List<UserData> dataList = new List<UserData>();
void Start()
{
filePath = Application.persistentDataPath + "/" + "AddressDataBase.json";
//Debug.Log(Application.persistentDataPath);
}
public void LoadGameData()
{
if(File.Exists(filePath))
{
string jData = File.ReadAllText(filePath);
dataList = JsonUtility.FromJson<Serialization<UserData>>(jData).target;
foreach (var user in dataList)
{
addressManager.CreateAddress(user); // 데이터를 박스에 담아 보여주기위한 메소드
}
print("불러오기 완료");
}
}
public void SaveGameData()
{
string jData = JsonUtility.ToJson(new Serialization<UserData>(dataList), true);
File.WriteAllText(filePath, jData);
print("저장 완료");
//Debug.Log(dataList.Count);
}
}
[ 설명 ]
public List<UserData> dataList = new List<UserData>();
데이터를 담을 리스트를 선언 해줍니다.
[System.Serializable]
public class Serialization<T>
{
public Serialization(List<T> _target) => target = _target;
public List<T> target;
}
List를 바로 Json으로 저장할 수 없지만 클래스는 저장이 된다.
이를 이용하여 위와 같은 클래스를 통해 한 번 감싸준 다음 이 클래스를 저장하여 내보내는 방식을 사용했다.
public Serialization(List<T> _target) => target = _target;
T파라미터 타입의 리스트를 매개변수로 하는 생성자를 만듭니다.
> List<UserData> dataList를 매개변수로 주기 위함.
public List<T> target;
target이라는 T파라미터 타입의 리스트를 단 하나의 인자를 가집니다.
( 처음 보고 제가 처음 접근한 생각은 맞았지만, 방식이 잘못되었다고 생각했습니다. )
public void SaveGameData()
{
string jData = JsonUtility.ToJson(new Serialization<UserData>(dataList), true);
File.WriteAllText(filePath, jData);
print("저장 완료");
Debug.Log(dataList.Count);
}
string jData = JsonUtility.ToJson(new Serialization<UserData>(dataList), true);
//prettyPrint : true일 경우 가독성을 좋게한다.
Serialization클래스를 dataList를 매개변수를 가지는 생성자로 선언하고,
이 값을 Json으로 변환하여 파일에 저장합니다.
File.WriteAlltext(string path, string contents);
새 파일을 만들어 지정된 문자열을 저장, 이미 대상 파일이 있으면 덮어쓰기
public void LoadGameData()
{
if(File.Exists(filePath))
{
string jData = File.ReadAllText(filePath);
dataList = JsonUtility.FromJson<Serialization<UserData>>(jData).target;
foreach (var user in dataList)
{
addressManager.CreateAddress(user);
}
print("불러오기 완료");
}
}
if(File.Exists(filePath))
파일이 존재한다면
string jData = File.ReadAllText(filePath);
파일 내용을 jData 변수에 담아
dataList = JsonUtility.FromJson<Serialization<UserData>>(jData).target;
jData에 담긴 Json형식의 스트링의 target의 데이터를 dataList에 저장
foreach (var user in dataList)
{
addressManager.CreateAddress(user);
}
이건 그냥 불러온 정보를 보여 주기 위한 코드이다.
이렇게 하여 결과를 보여주면
[참조1 ] : https://www.youtube.com/watch?v=z-eBBEw8gbw
JsonUtilities.ToJson with List<string> not working as expected
Hi guys, I'm trying to serialize a list using JsonUtilities.ToJson, however I'm running into a problem When I do the above, the string that it...
forum.unity.com
'유니티' 카테고리의 다른 글
[Unity] TCP/IP 통신 Server, Client 흐름 (0) | 2023.04.13 |
---|---|
[Unity] SQLite로 데이터 관리하기 (0) | 2023.04.07 |