세이브 로드. 직렬화 역직렬화. 해도 해도 모르겠다.
지난 게임 만들때는 Json으로 세이브 로드를 구현했는데,
구현하면서 제일 이해가 안 되었던게 역직렬화 부분이었음.
Actor{
int Age;
string Name;
}
Sword{
int Damage;
}
이런거야 세이브 로드 하기 쉽지. 안에 데이터가 전부 직렬화 되는 원시데이터니까.
근데 다음은 어떻게 함?
Actor{
int Age;
string Name;
Weapon Sword;
}
이런 구조가 되면, Actor를 직렬화/역직렬화 하고 나면 Actor.Weapon == null 이 되버리잖아.
그럼 Actor.Init(Weapon weapon) 등을 추가로 작성해서 Weapon 만들어서 일일이 달아줘야 함?
...
var actor = new Actor (Serializer.Deserial(SaveData.Actor));
var weapon = new Weapon (Serializer.Deserial(SaveData.Weapon));
Actor.Init(weapon); <- 이 부분이 하드코딩 (저번 겜 만들때는 이렇게 했음;;)
ECS의 경우에는 저장할때 각 객체의 ID 를 int 값으로 따놓고 ID만 저장해서 세이브 로드 하는 방법을 써본적은 있음.
근데 굉장히 바보같더라. 생성된 객체들을 다 꺼내놓고 ID로 서로 이어주기 실뜨기 놀이 해줘야 하니.
그때 만든 세이브로더 : https://github.com/raveneer/EntitasSaveLoader
질문요약
객체간의 참조까지 세이브 로드할 수 있는 시리얼/디시리얼 솔루션이 존재해?
하드코딩 할 수 있지만
하고싶지 않은데숭...
바이너리 포메터 쓰면 구조 바뀌면 아예 고장남
해당 댓글은 삭제되었습니다.
그거 달아준다고 해서 참조가 저장되진 않잖아
ㅇㅇ 그걸 알고 있어서 하는 질문임. 어차피 주소인데 겜 켤때마다 주소 싹 바뀌잖음.
굳이 Weapon 을 따로 직렬화할 필요 있나? 싸그리 직렬화하고 역직렬화 화면 되잖아. 마샬링을 알면 참조는 머리짜매봐야 기름도 안나온다는 걸 알텐데?
마샬링이 뭔지 몰랐음. 고마워 찾아볼게!
뭐 거한 건 없고 (역)직렬화의 상위 개념이 마샬링이야. Marchal by Reference 보면 알겠지만 니가 하고싶은 건 안된다는 거지.
역시 하드코딩 뿐인가... 어흑 그래도 안된다는 걸 알았다는게 큰 소득이었음 감사합니다 센세