I’m trying to run this line of code within my custom Archive class for loading (deserializing):
UClass* Class = FindObjectChecked<UClass>(ANY_PACKAGE, *ClassName);
if (Class->IsChildOf(AActor::StaticClass()))
{
Obj = DuplicateObject<UObject>(Class->GetDefaultObject(), this->Outer);
}
But when I do, I get this error:
[2015.10.09-17.16.17:374][360]LogWindows: === Critical error: === Fatal error: [File:D:\BuildFarm\buildmachine_++depot+UE4-Releases+4.9\Engine\Source\Runtime\CoreUObject\Private\Templates\Casts.cpp]
[Line: 11] Cast of InventoryManager
/Game/Levels/UEDPIE_0_Level_TestingUI.Level_TestingUI:PersistentLevel.InventoryManager_0
to Level failed
It triggers this error somewhere in the DuplicateObject code. How to make sense of this error? Thank you.
The C++ test code is below:
/** Handles the saving/loading of UObject properties */
struct FSaveGameObjectArchive : public FObjectAndNameAsStringProxyArchive
{
/** Used as the Outer object when creating other objects */
UObject* Outer;
FSaveGameObjectArchive(FArchive& InInnerArchive)
: FObjectAndNameAsStringProxyArchive(InInnerArchive, false)
{
this->ArIsSaveGame = true;
InInnerArchive.ArIsSaveGame = true;
this->Outer = (UObject*)GetTransientPackage();
}
/** Saves or loads UObjects */
virtual FArchive& operator<<(class UObject*& Obj)
{
if (this->ArIsSaving)
{
FString ClassName = Obj->GetClass()->GetName();
this->InnerArchive << ClassName;
}
else if (this->ArIsLoading)
{
FString ClassName;
this->InnerArchive << ClassName;
UClass* Class = FindObjectChecked<UClass>(ANY_PACKAGE, *ClassName);
if (Class->IsChildOf(AActor::StaticClass()))
{
Obj = DuplicateObject<UObject>(Class->GetDefaultObject(), this->Outer);
}
else
{
Obj = NewObject<UObject>(this->Outer, Class);
}
}
Obj->Serialize(*this);
return *this;
}
};
UCLASS()
class AInventoryManager : public AInfo
{
GENERATED_BODY()
public:
UPROPERTY(SaveGame)
int32 JustSomeTestInt32;
};
UCLASS()
class ATestingGameMode : public AGameMode
{
GENERATED_BODY()
public:
virtual void InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage) override
{
// Setup for testing purposes
AInventoryManager* IM = this->GetWorld()->SpawnActor<AInventoryManager>();
IM->JustSomeTestInt32 = 57;
// Setup for saving (serializing)
FBufferArchive Buffer(true);
FSaveGameObjectArchive ArSave(Buffer);
// Serialize the InventoryManager
UObject* Obj = Cast<UObject>(this);
ArSave << Obj;
// Copy all the serialized data from Buffer into this reader
FArrayReader RBuffer;
RBuffer.SetNum(Buffer.Num());
for (int32 i = 0, Num = Buffer.Num(); i < Num; ++i)
{
RBuffer[i] = Buffer[i];
}
// Setup for loading (deserializing)
FSaveGameObjectArchive ArRead(RBuffer);
ArRead.Outer = this;
// Deserialize the InventoryManager
ArRead << Obj;
}
};