void UUserDefinedStruct::SerializeTaggedProperties(FArchive& Ar, uint8* Data, UStruct* DefaultsStruct, uint8* Defaults, const UObject* BreakRecursionIfFullyLoad) const { #if WITH_EDITOR /* The following code is responsible for UUserDefinedStruct's default values serialization. */ auto UDDefaultsStruct = Cast<UUserDefinedStruct>(DefaultsStruct); const bool bDuplicate = (0 != (Ar.GetPortFlags() & PPF_Duplicate)); /* When saving delta, we want the difference between current data and true structure's default values. When Defaults is NULL then zeroed data will be used for comparison.*/ const bool bUseNewDefaults = !Defaults && UDDefaultsStruct && Ar.DoDelta() && Ar.IsSaving() && !bDuplicate && !Ar.IsCooking(); /* Object serialized from delta will have missing properties filled with zeroed data, we want structure's default data instead */ const bool bLoadDefaultFirst = UDDefaultsStruct && !bDuplicate && Ar.IsLoading(); const bool bPrepareDefaultStruct = bUseNewDefaults || bLoadDefaultFirst; FStructOnScope StructDefaultMem(bPrepareDefaultStruct ? UDDefaultsStruct : NULL); if (bPrepareDefaultStruct) { FStructureEditorUtils::Fill_MakeStructureDefaultValue(UDDefaultsStruct, StructDefaultMem.GetStructMemory()); } if (bUseNewDefaults) { Defaults = StructDefaultMem.GetStructMemory(); } if (bLoadDefaultFirst) { if (Defaults == nullptr) { Defaults = StructDefaultMem.GetStructMemory(); } UDDefaultsStruct->CopyScriptStruct(Data, Defaults); } #endif // WITH_EDITOR Super::SerializeTaggedProperties(Ar, Data, DefaultsStruct, Defaults); }