Unreal Engine 4.24 Released!

Hi,

I upgraded directly from 4.22.3 (I would have upgraded to 4.23.x but it contained a bug that broke my project) - but I think I have found a regression added in either 4.23.x or 4.24.x with regards to FArchive handling.

The below code worked fine in 4.22.3 to serialise and restore a UObject from a stream of bytes:



struct FEstSaveGameArchive : public FObjectAndNameAsStringProxyArchive
{
    FEstSaveGameArchive(FArchive& InInnerArchive)
        : FObjectAndNameAsStringProxyArchive(InInnerArchive, true)
    {
        ArIsSaveGame = true;
        ArNoDelta = true;
    }
};

void UEstSaveStatics::RestoreLowLevel(UObject* Object, TArray<uint8> Bytes)
{
    FMemoryReader MemoryReader(Bytes, true);
    FEstSaveGameArchive Ar(MemoryReader);
    Object->Serialize(Ar);
}

void UEstSaveStatics::SerializeLowLevel(UObject* Object, TArray<uint8>& InBytes)
{
    FMemoryWriter MemoryWriter(InBytes, true);
    FEstSaveGameArchive Ar(MemoryWriter);
    Object->Serialize(Ar);
}


Code on GitHub: Estranged.Core/EstSaveStatics.cpp at 980c909801c255de7220cf0e040862ccdaabe071 · alanedwardes/Estranged.Core · GitHub

This did not work after upgrading to 4.24.0 - specifically the RestoreLowLevel method did not restore all SaveGame UPROPERTY members as expected in Shipping/DebugGame builds (it instead zeroed them - so floats set to zero, bools false etc). It did not happen in the editor builds, the members were restored as expected.

I found the below workaround to make this work in 4.24.0:



void UEstSaveStatics::RestoreLowLevel(UObject* Object, TArray<uint8> Bytes)
{
    FMemoryReader MemoryReader(Bytes, true);
    FObjectAndNameAsStringProxyArchive Ar(MemoryReader, true);
    Object->Serialize(Ar);
}

void UEstSaveStatics::SerializeLowLevel(UObject* Object, TArray<uint8>& InBytes)
{
    FMemoryWriter MemoryWriter(InBytes, true);
    FObjectAndNameAsStringProxyArchive Ar(MemoryWriter, true);
    Ar.ArIsSaveGame = true;
    Ar.ArNoDelta = true;
    Object->Serialize(Ar);
}


Code on GitHub: Estranged.Core/EstSaveStatics.cpp at 739feee5eaabd3e5be617f976e6e3351800b49fd · alanedwardes/Estranged.Core · GitHub

The RestoreLowLevel method doesn’t work if you set ArIsSaveGame = true or ArNoDelta = true, but only in Shipping/DebugGame builds, in editor builds it restores the UPROPERTY members maked with SaveGame as expected.

Regardless of whether I should be setting those booleans when restoring or not, the difference in behaviour between shipping / editor builds is a bit worrying!

Alan

1 Like