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