1. ์ง๋ ฌํ
- ์ค๋ธ์ ํธ๋ ์ฐ๊ฒฐ๋ ์ค๋ธ์ ํธ์ ๋ฌถ์(์ค๋ธ์ ํธ ๊ทธ๋ํ)์ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๋ ๊ณผ์
- ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ ฌ๋ก ์ธ์ฐ๊ธฐ ๋๋ฌธ์ ์ง๋ ฌํ
- ๊ฑฐ๊พธ๋ก ๋ณต๊ตฌ์ํค๋ ๊ณผ์ ๋ ํฌํจํด์ ์๋ฏธ
- ์๋ฆฌ์ผ๋ผ์ด์ ์ด์ : ์ค๋ธ์ ํธ ๊ทธ๋ํ ๐ ๋ฐ์ดํธ ์คํธ๋ฆผ
- ๋์๋ฆฌ์ผ๋ผ์ด์ ์ด์ : ๋ฐ์ดํธ ์คํธ๋ฆผ ๐ ์ค๋ธ์ ํธ ๊ทธ๋ํ
- ์ฅ์
- ํ์ฌ ํ๋ก๊ทธ๋จ์์ํ๋ฅผ ์ ์ฅํ๊ณ ํ์ํ ๋ ๋ณต์ ๊ฐ๋ฅ (๊ฒ์์ ์ ์ฅ)
- ํ์ฌ ๊ฐ์ฒด์ ์ ๋ณด๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌํด์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์ ์ก ๊ฐ๋ฅ
- ๋คํธ์ํฌ๋ฅผ ํตํด ํ์ฌ ํ๋ก๊ทธ๋จ์ ์ํ๋ฅผ ๋ค๋ฅธ ์ปดํจํฐ์ ๋ณต์ ๊ฐ๋ฅ (๋ฉํฐํ๋ ์ด์ด ๊ฒ์)
- ๋ฐ์ดํฐ ์์ถ, ์ํธํ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์์ ํ๊ฒ ๋ณด๊ด ๊ฐ๋ฅ
๐ฉ ๊ตฌํ์ ๊ณ ๋ คํ ์
- ๋ฐ์ดํฐ ๋ ์ด์์ : ์ค๋ธ์ ํธ๊ฐ ์์ ํ ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ ๊ฒ์ธ๊ฐ?
- ์ด์์ฑ : ์๋ก ๋ค๋ฅธ ์์คํ ์ ์ ์กํด๋ ์ด์๋ ์ ์๋๊ฐ?
- ๋ฒ์ ๊ด๋ฆฌ : ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋ ์ด๋ฅผ ์ด๋ป๊ฒ ํ์ฅํ๊ณ ์ฒ๋ฆฌํ ๊ฒ์ธ๊ฐ?
- ์ฑ๋ฅ : ๋คํธ์ ๋น์ฉ์ ์ค์ด๊ธฐ ์ํด ์ด๋ค ๋ฐ์ดํฐ ํ์์ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ?
- ๋ณด์ : ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์์ ํ๊ฒ ๋ณดํธํ ๊ฒ์ธ๊ฐ?
- ์๋ฌ ์ฒ๋ฆฌ : ์ ์ก ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ด๋ป๊ฒ ์ธ์ํ๊ณ ์ฒ๋ฆฌํ ๊ฒ์ธ๊ฐ?
๐ ์ด๋ฌํ ์ํฉ์ ๋ชจ๋ ๊ฐ์ํด ์ง๋ ฌํ ๋ชจ๋ธ์ ๋ง๋๋ ๊ฒ์ ์ฌ์ด ์ผ์ด ์๋
๐ฉ ์ธ๋ฆฌ์ผ ์์ง์ ์ง๋ ฌํ ์์คํ
- ์ธ๋ฆฌ์ผ ์์ง์ ์ด๋ฌํ ์ํฉ์ ๋ชจ๋ ๊ณ ๋ คํ ์ง๋ ฌํ ์์คํ ์ ์์ฒด์ ์ผ๋ก ์ ๊ณตํ๊ณ ์์
- ์ง๋ ฌํ ์์คํ
์ ์ํด ์ ๊ณตํ๋ ํด๋์ค FArchive์ ์ฐ์ฐ์
- ์์นด์ด๋ธ ํด๋์ค(FArchive)
- Shift(<<) operator
- ๋ค์ํ ์์นด์ด๋ธ ํด๋์ค์ ์ ๊ณต
- ๋ฉ๋ชจ๋ฆฌ ์์นด์ด๋ธ (FMemoryReader, FMemoryWriter)
- ํ์ผ ์์นด์ด๋ธ (FArchiveFileReaderGeneric, FArchiveFileWriterGeneric)
- ๊ธฐํ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ์ ๊ด๋ จ๋ ์์นด์ด๋ธ ํด๋์ค (FArchiveUObject)
- Json ์ง๋ ฌํ ๊ธฐ๋ฅ : ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ ๊ณตํ๊ณ ์์
๐ MyGameInstance(h, cpp)
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "MyGameInstance.generated.h"
struct FStudentData {
FStudentData() {}
FStudentData(int32 InOrder, const FString& InName) : Order(InOrder), Name(InName) {}
friend FArchive& operator<<(FArchive& Ar, FStudentData& InStudentData) {
Ar << InStudentData.Order;
Ar << InStudentData.Name;
return Ar;
}
int32 Order = -1;
FString Name = TEXT("ํ๊ธธ๋");
};
/**
*
*/
UCLASS()
class UNREALSERIALIZATION_API UMyGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
UMyGameInstance();
virtual void Init() override;
private:
UPROPERTY()
TObjectPtr<class UStudent> StudentSrc;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyGameInstance.h"
#include "Student.h"
void PrintStudentInfo(const UStudent* InStudent, const FString& InTag) {
UE_LOG(LogTemp, Log, TEXT("[%s] ์ด๋ฆ %s ์๋ฒ %d"), *InTag, *InStudent->GetName(), InStudent->GetOrder());
}
UMyGameInstance::UMyGameInstance()
{
}
void UMyGameInstance::Init()
{
Super::Init();
FStudentData RawDataSrc(16, TEXT("์ด๋์ฐ"));
const FString SavedDir = FPaths::Combine(FPlatformMisc::ProjectDir(), TEXT("Saved"));
UE_LOG(LogTemp, Log, TEXT("์ ์ฅํ ํ์ผ ํด๋ : %s"), *SavedDir);
{
const FString RawDataFileName(TEXT("RawData.bin"));
FString RawDataAbsolutePath = FPaths::Combine(*SavedDir, *RawDataFileName);
UE_LOG(LogTemp, Log, TEXT("์ ์ฅํ ํ์ผ ์ ์ฒด ๊ฒฝ๋ก : %s"), *RawDataAbsolutePath);
FPaths::MakeStandardFilename(RawDataAbsolutePath);
UE_LOG(LogTemp, Log, TEXT("๋ณ๊ฒฝํ ํ์ผ ์ ์ฒด ๊ฒฝ๋ก : %s"), *RawDataAbsolutePath);
FArchive* RawFileWriterAr = IFileManager::Get().CreateFileWriter(*RawDataAbsolutePath);
if (nullptr != RawFileWriterAr) {
*RawFileWriterAr << RawDataSrc;
RawFileWriterAr->Close();
delete RawFileWriterAr;
RawFileWriterAr = nullptr;
}
FStudentData RawDataDest;
FArchive* RawFileReaderAr = IFileManager::Get().CreateFileReader(*RawDataAbsolutePath);
if (nullptr != RawFileReaderAr) {
*RawFileReaderAr << RawDataDest;
RawFileReaderAr->Close();
delete RawFileReaderAr;
RawFileReaderAr = nullptr;
UE_LOG(LogTemp, Log, TEXT("[RawData] ์ด๋ฆ %s, ์๋ฒ %d"), *RawDataDest.Name, RawDataDest.Order);
}
}
StudentSrc = NewObject<UStudent>();
StudentSrc->SetName(TEXT("์ด๋์ฐ"));
StudentSrc->SetOrder(59);
{
const FString ObjectDataFileName(TEXT("ObjectData.bin"));
FString ObjectDataAbsolutePath = FPaths::Combine(*SavedDir, *ObjectDataFileName);
FPaths::MakeStandardFilename(ObjectDataAbsolutePath);
TArray<uint8> BufferArray;
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"));
}
}
๐ Student(h, cpp)
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Student.generated.h"
/**
*
*/
UCLASS()
class UNREALSERIALIZATION_API UStudent : public UObject
{
GENERATED_BODY()
public:
UStudent();
int32 GetOrder() const { return Order; }
void SetOrder(int32 InOrder) { Order = InOrder; }
const FString& GetName() const { return Name; }
void SetName(const FString& InName) { Name = InName; }
virtual void Serialize(FArchive& Ar) override;
private:
UPROPERTY()
int32 Order;
UPROPERTY()
FString Name;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "Student.h"
UStudent::UStudent()
{
Order = -1;
Name = TEXT("ํ๊ธธ๋");
}
void UStudent::Serialize(FArchive& Ar)
{
Super::Serialize(Ar);
Ar << Order;
Ar << Name;
}
๐ฉ Json ์ง๋ ฌ
- Json์ ์ฝ์
- ์น ํ๊ฒฝ์์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉํ๋ ํ ์คํธ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ํฌ๋งท'
- Json ์ฅ์
- ํ ์คํธ์์๋ ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ๊ฐ๋ฒผ์
- ์ฝ๊ธฐ ํธํด์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ์ดํดํ ์ ์์
- ์ฌ์ค ์ ์น ํต์ ์ ํ์ค์ผ๋ก ๋๋ฆฌ ์ฌ์ฉ๋จ
- Json ๋จ์
- ์ง์ํ๋ ํ์ ์ด ๋ช ๊ฐ์ง ์๋จ (๋ฌธ์, ์ซ์, ๋ถ๋ฆฌ์ธ, ๋, ๋ฐฐ์ด, ์ค๋ธ์ ํธ๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
- ํ ์คํธ ํ์์ผ๋ก๋ง ์ฌ์ฉํ ์ ์์
- ์ธ๋ฆฌ์ผ ์์ง์ Json, JjsonUtilities ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
๐ Json ๋ฐ์ดํฐ ์์
- Json ๋ฐ์ดํฐ ์ ํ
- ์ค๋ธ์ ํธ {}
- ์ค๋ธ์ ํธ ๋ด ๋ฐ์ดํฐ๋ ํค, ๋ฐธ๋ฅ ์กฐํฉ์ผ๋ก ๊ตฌ์ฑ๋จ ์) {"key" : 10}
- ๋ฐฐ์ด []
- ๋ฐฐ์ด ๋ด ๋ฐ์ดํฐ๋ ๋ฐธ๋ฅ๋ก๋ง ๊ตฌ์ฑ๋จ ์) ["value1", "value2", "value3"]
- ์ด์ธ ๋ฐ์ดํฐ
- ๋ฌธ์์ด("string"), ์ซ์(10 ๋๋ 3.14), ๋ถ๋ฆฌ์ธ(true / false), ๋(null)๋ก ๊ตฌ์ฑ
- ์ค๋ธ์ ํธ {}
{
"Name" : "์ด๋์ฐ",
"Order" : 59
}
2. ์ธ๋ฆฌ์ผ ์ค๋งํธ ํฌ์ธํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์
- ์ผ๋ฐ C++ ์ค๋ธ์ ํธ์ ํฌ์ธํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ๋ ์ธ๋ฆฌ์ผ ์์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- TUniquePtr(์ ๋ํฌ ํฌ์ธํฐ) : ์ง์ ํ ๊ณณ์์๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ํฌ์ธํฐ
- ํน์ ์ค๋ธ์ ํธ์๊ฒ ๋ช ํํ๊ฒ ํฌ์ธํฐ ํด์ง ๊ถํ์ ์ฃผ๊ณ ์ถ์ ๊ฒฝ์ฐ
- delete ๊ตฌ๋ฌธ ์์ด ํจ์ ์คํ ํ ์๋์ผ๋ก ์๋ฉธ์ํค๊ณ ์ถ์ ๋
- TSharedPtr(๊ณต์ ํฌ์ธํฐ) : ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉด ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์งํ๋ ํฌ์ธํฐ
- ์ฌ๋ฌ ๋ก์ง์์ ํ ๋น๋ ์ค๋ธ์ ํธ๊ฐ ๊ณต์ ํด์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ
- ๋ค๋ฅธ ํจ์๋ก๋ถํฐ ํ ๋น๋ ์ค๋ธ์ ํธ๋ฅผ out์ผ๋ก ๋ฐ๋ ๊ฒฝ์ฐ
- null์ผ ์ ์์
- TSharedRef(๊ณต์ ๋ ํผ๋ฐ์ค) :๊ณต์ ํฌ์ธํฐ์ ๋์ผํ์ง๋ง, ์ ํจํ ๊ฐ์ฒด๋ฅผ ํญ์ ๋ณด์ฅ๋ฐ๋ ๋ ํผ๋ฐ์ค
- ์ฌ๋ฌ ๋ก์ง์์ ํ ๋น๋ ์ค๋ธ์ ํธ๊ฐ ๊ณต์ ํด์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ
- not null์ ๋ณด์ฅ๋ฐ์ผ๋ฉฐ ์ค๋ธ์ ํธ๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ
๐ ๋ชจ๋ 2๊ฐ ์ถ๊ฐํด์ฃผ๊ธฐ!
๐ MyGameInstance(cpp) ์ฝ๋
#include "JsonObjectConverter.h"
// json ์ง๋ ฌํ
{
const FString JsonDataFileName(TEXT("StudentJsonData.txt"));
FString JsonDataAbsolutePath = FPaths::Combine(*SavedDir, *JsonDataFileName);
FPaths::MakeStandardFilename(JsonDataAbsolutePath);
TSharedRef<FJsonObject> JsonObjectSrc = MakeShared<FJsonObject>();
FJsonObjectConverter::UStructToJsonObject(StudentSrc->GetClass(), StudentSrc, JsonObjectSrc);
FString JsonOutString;
TSharedRef<TJsonWriter<TCHAR>> JsonWriterAr = TJsonWriterFactory<TCHAR>::Create(&JsonOutString);
if (FJsonSerializer::Serialize(JsonObjectSrc, JsonWriterAr)) {
FFileHelper::SaveStringToFile(JsonOutString, *JsonDataAbsolutePath);
}
FString JsonInString;
FFileHelper::LoadFileToString(JsonInString, *JsonDataAbsolutePath);
TSharedRef<TJsonReader<TCHAR>> JsonReaderAr = TJsonReaderFactory<TCHAR>::Create(JsonInString);\
TSharedPtr<FJsonObject> JsonObjectDest;
if (FJsonSerializer::Deserialize(JsonReaderAr, JsonObjectDest)) {
UStudent* JsonStudentDest = NewObject<UStudent>();
if(FJsonObjectConverter::JsonObjectToUStruct(JsonObjectDest.ToSharedRef(), JsonStudentDest->GetClass(), JsonStudentDest)) {
PrintStudentInfo(JsonStudentDest, TEXT("JsonData"));
}
}
}
'โ๏ธ ์์ง > ๐ซ ์ธ๋ฆฌ์ผ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Unreal] ์ธ๋ฆฌ์ผ ๋น๋ ์์คํ (0) | 2024.05.08 |
---|---|
[Unreal] ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ ๊ด๋ฆฌ2 - ํจํค์ง (0) | 2024.05.08 |
[Unreal] ์์ํด์ ์ธ๋ฆฌ์ผ 2024 - 1. ๋ ๋ฒจ ์ ์ํ๊ธฐ (0) | 2024.05.05 |
[Unreal] ์ธ๋ฆฌ์ผ ์์ง์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ (0) | 2024.05.05 |
[Unreal] ์ธ๋ฆฌ์ผ ์ปจํ ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ2 - ๊ตฌ์กฐ์ฒด์ TMap (0) | 2024.05.04 |