void UMyGameInstance::Init()
{
Super::Init();
/// Mk.1
// 구조체에 데이터 넣음
FStudentData RawDataSrc(16, TEXT("이득우"));
// 현재 프로젝트 경로에 있는 Saved 폴더 경로를 가져옴
const FString SavedDir = FPaths::Combine(FPlatformMisc::ProjectDir(), TEXT("Saved"));
UE_LOG(LogTemp, Log, TEXT("저장할 파일 폴더 : %s"), *SavedDir);
{
// Saved폴더 안에 RawData.bin 파일을 만듬
const FString RawDataFileName(TEXT("RawData.bin"));
FString RawDataAbosolutePath = FPaths::Combine(SavedDir, "RawDataFileName");
UE_LOG(LogTemp, Log, TEXT("저장할 파일 전체 경로 : %s"), *RawDataAbosolutePath);
// RawData.bin 까지의 경로를 다시 표준 형식으로 만듬
FPaths::MakeStandardFilename(RawDataAbosolutePath);
UE_LOG(LogTemp, Log, TEXT("변경할 파일 전체 경로 : %s"), *RawDataAbosolutePath);
// 아카이브 쓰기전용 클래스 생성
FArchive* RawFileWriterAr = IFileManager::Get().CreateFileWriter(*RawDataAbosolutePath);
if (nullptr != RawFileWriterAr)
{
// bin 파일에 처음에 만든 구조체 정보를 넣음 (<< 는 구조체에서 오퍼레이터 연산자 구현 했음)
*RawFileWriterAr << RawDataSrc;
RawFileWriterAr->Close();
delete RawFileWriterAr;
RawFileWriterAr = nullptr;
}
// 아카이브 읽거 전용 클래스 생성
FStudentData RawDataDest;
FArchive* RawFileReaderAr = IFileManager::Get().CreateFileReader(*RawDataAbosolutePath);
if (nullptr != RawFileReaderAr)
{
// 이번에는 역으로 bin 파일에서 구조체로 정보를 가져옴
*RawFileReaderAr << RawDataDest;
RawFileReaderAr->Close();
delete RawFileReaderAr;
RawFileReaderAr = nullptr;
UE_LOG(LogTemp, Log, TEXT("{RawData} 이름 %s 순번 %d"), *RawDataDest.Name, RawDataDest.Order);
}
}
/// Mk.2
// 새로운 학생 데이터 생성
StudentSrc = NewObject<UStudent>();
StudentSrc->SetName(TEXT("이득우"));
StudentSrc->SetOrder(59);
{
// Saved 폴더에 bin 파일 새로 생성
const FString ObjectDataFileName(TEXT("ObjectData.bin"));
FString ObjectDataAbsolutePath = FPaths::Combine(*SavedDir, *ObjectDataFileName);
// 경로 표준화
FPaths::MakeStandardFilename(ObjectDataAbsolutePath);
// 학생 정보를 시리얼라이즈할 배열 생성
TArray<uint8> BufferArray;
// 배열과 writer 연결
FMemoryWriter MemoryWriterAr(BufferArray);
StudentSrc->Serialize(MemoryWriterAr);
// 쓰기 아카이브 생성
if (TUniquePtr<FArchive> FileWriterAr = TUniquePtr<FArchive>(IFileManager::Get().CreateFileWriter(*ObjectDataAbsolutePath)))
{
// 시리얼라이즈한 배열을 아카이브에 쓰기
*FileWriterAr << BufferArray;
FileWriterAr->Close();
}
// 파일로부터 읽어와서 저장할 배열 생성
TArray<uint8> BufferArrayFromFile;
// 읽기 아카이브 생성
if (TUniquePtr<FArchive> FileReaderAr = TUniquePtr<FArchive>(IFileManager::Get().CreateFileReader(*ObjectDataAbsolutePath)))
{
// 파일로부터 배열로 읽어들이기
*FileReaderAr << BufferArrayFromFile;
FileReaderAr->Close();
}
// 배열과 읽기 아카이브 연결
FMemoryReader MemoryReaderAr(BufferArrayFromFile);
UStudent* StudentDest = NewObject<UStudent>();
// 학생 정보 생성
StudentDest->Serialize(MemoryReaderAr);
// 테스트 출력
PrintStudentInfo(StudentDest, TEXT("ObjectData"));
}
}
저장할 파일 경로
Writer 열기 및 쓰기
Reader 열기 및 읽기
오브젝트 직렬화
데이터 쓰기
읽어온 파일로 UObject 생성
언리얼 엔진의 Json, JsonUtilities 라이브러리 활용
/// Mk.3 Json + 스마트포인터
{
/// Json 쓰기
// 파일 생성 및 경로 표준화
FString JsonDataFileName(TEXT("StudentJsonData.txt"));
FString JsonDataAbsolutePath = FPaths::Combine(*SavedDir, *JsonDataFileName);
FPaths::MakeStandardFilename(JsonDataFileName);
// Json 오브젝트 생성 (스마트 포인터로)
TSharedRef<FJsonObject> JsonObjectSrc = MakeShared<FJsonObject>();
// 학생 정보를 Json 오브젝트로 변환
FJsonObjectConverter::UStructToJsonObject(StudentSrc->GetClass(), StudentSrc, JsonObjectSrc);
// Json 쓰기 아카이브 생성 및 string 연결
FString JsonOutString;
TSharedRef<TJsonWriter<TCHAR>> JsonWriterAr = TJsonWriterFactory<TCHAR>::Create(&JsonOutString);
// Json 오브젝트 시리얼라이즈
if (FJsonSerializer::Serialize(JsonObjectSrc, JsonWriterAr))
{
// 시리얼라이즈 해서 얻은 string 을 사용하여 json 파일에 저장
FFileHelper::SaveStringToFile(JsonOutString, *JsonDataAbsolutePath);
}
/// Json 읽기
// Json 파일정보를 string으로 가져오기
FString JsonInString;
FFileHelper::LoadFileToString(JsonInString, *JsonDataAbsolutePath);
// Json 읽기 아카이브 생성 및 string 연결
TSharedRef<TJsonReader<TCHAR>> JsonReaderAr = TJsonReaderFactory<TCHAR>::Create(JsonInString);
// Json 오브젝트 생성
TSharedPtr<FJsonObject> JsonObjectDest;
// Json 오브젝트 디시리얼라이즈
if (FJsonSerializer::Deserialize(JsonReaderAr, JsonObjectDest))
{
// 테스트용 학생 생성
UStudent* JsonStudentDest = NewObject<UStudent>();
// Json 오브젝트 정보를 학생에 기입
if (FJsonObjectConverter::JsonObjectToUStruct(JsonObjectDest.ToSharedRef(), JsonStudentDest->GetClass(), JsonStudentDest))
{
// 테스트 출력
PrintStudentInfo(JsonStudentDest, TEXT("JsonData"));
}
}
}