실습
- 저장할 파일 경로
- FPlatformMisc::ProjectDir 을 통해 프로젝트 경로
- FPaths::Combine 을 통해 경로 및 파일 이름 합치기
- FPaths::MakeStandardFilename 을 통해 경로를 정상화
- 아마 이상한 상대경로를 절대경로로 바꿔주는 듯
- Writer 열기 및 쓰기
- FArchive 의 상속을 받으므로 FArchive로 선언
- IFileManager::Get().CreateFileWriter 를 통해 경로의 파일을 열음
FArchive* Writer = IFileManager::Get().CreateFileWriter(*경로);
- << 연산자를 통해서 데이터를 쓸 수 있음
- 데이터에 << 연산자를 오버로딩해서 사용할 수 있음
friend FArchive& operator<<(FArchive & Ar, 구조체& In구조체)
{
Ar << 구조체.Data;
return Ar;
}
- 사용 후 Close 호출 및 delete 및 nullptr 대입
if (nullptr != Writer)
{
*Writer << 구조체데이터
Writer->Close();
delete Writer;
Writer = nullptr;
}
- Reader 열기 및 읽기
- Writer와 거의 동일
- IFileManager::Get().CreateFileReader 로 열음
UObject 실습
- 오브젝트 직렬화
- TArray< uint8 >의 버퍼 생성
- FMemoryWriter 생성
- Serialize
TArray<uint8> BufferArray;
FMemoryWriter MemoryWriterAr(BufferArray);
오브젝트->Serialize(MemoryWriterAr);
- 데이터 쓰기
- delete, nullptr 안쓰려면 TUniquePtr 사용
- 읽기도 읽어올 버퍼 생성하고 Reader로 진행
if (TUniquePtr<FArchive> FileWriterAr = TUniquePtr<FArchive>(IFileManager::Get().CreateFileWriter(*경로)))
{
*FileWriterAr << BufferArray;
FileWriterAr->Close();
}
- 읽어온 파일로 UObject 생성
- FMemoryReader 생성
- 오브젝트 생성 및 Serialize로 데이터 채워주기
FMemoryReader MemoryReaderAr(파일 읽은 버퍼);
언리얼오브젝트* 오브젝트 = NewObject<언리얼오브젝트>();
오브젝트->Serialize(MemoryReaderAr);
Json 실습
- #include "JsonObjectConverter.h" 해야함
- 프로젝트.Build.cs 파일에 모듈 이름에 "Json", "JsonUtilities" 추가해야함
TSharedRef<FJsonObject> Json오브젝트 =
MakeShared<FJsonObject>();
FJsonObjectConverter::UStructToJsonObject(
U오브젝트->GetClass(), U오브젝트, Json오브젝트);
- 문자열로 Json오브젝트 변환 및 파일 저장
- Json Writer 생성
- Serialize
- FFileHelper::SaveStringToFile
TSharedRef<TJsonWriter<TCHAR>> JsonWriterAr =
TJsonWriterFactory<TCHAR>::Create(&스트링);
if (FJsonSerializer::Serialize(Json오브젝트, JsonWriterAr))
{
FFileHelper::SaveStringToFile(스트링, *경로);
}
- 읽어들이기
- 스트링으로 불러오기
- Json Reader 생성
- Deserialize
- FJsonObjectConverter::JsonObjectToUStruct
FFileHelper::LoadFileToString(저장스트링, *경로);
TSharedRef<TJsonReader<TCHAR>> JsonReaderAr =
TJsonReaderFactory<TCHAR>::Create(저장스트링);
TSharedPtr<FJsonObject> 저장Json오브젝트;
if (FJsonSerializer::Deserialize(
JsonReaderAr, 저장Json오브젝트))
{
U오브젝트* 저장오브젝트 = NewObject<U오브젝트>();
if (FJsonObjectConverter::JsonObjectToUStruct(
저장Json오브젝트.ToSharedRef(),
저장오브젝트->GetClass(),
저장오브젝트))
{
//...
}
}