DuplicateObject trying to cast to Level?

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;
	}
};