void UStructProperty::SerializeItem( FArchive& Ar, void* Value, int32 MaxReadBytes, void const* Defaults ) const { const bool bUseBinarySerialization = UseBinarySerialization(Ar); const bool bUseNativeSerialization = UseNativeSerialization(); // Preload struct before serialization tracking to not double count time. if ( bUseBinarySerialization || bUseNativeSerialization) { Ar.Preload( Struct ); } bool bItemSerialized = false; if (bUseNativeSerialization) { UScriptStruct::ICppStructOps* CppStructOps = Struct->GetCppStructOps(); check(CppStructOps); // else should not have STRUCT_SerializeNative check(!Struct->InheritedCppStructOps()); // else should not have STRUCT_SerializeNative bItemSerialized = CppStructOps->Serialize(Ar, Value); } if (!bItemSerialized) { if( bUseBinarySerialization ) { // Struct is already preloaded above. if ( !Ar.IsPersistent() && Ar.GetPortFlags() != 0 && !Struct->ShouldSerializeAtomically(Ar) ) { Struct->SerializeBinEx( Ar, Value, Defaults, Struct ); } else { Struct->SerializeBin( Ar, Value, MaxReadBytes ); } } else { Struct->SerializeTaggedProperties( Ar, (uint8*)Value, Struct, (uint8*)Defaults ); } } if (Struct->StructFlags & STRUCT_PostSerializeNative) { UScriptStruct::ICppStructOps* CppStructOps = Struct->GetCppStructOps(); check(CppStructOps); // else should not have STRUCT_PostSerializeNative check(!Struct->InheritedCppStructOps()); // else should not have STRUCT_PostSerializeNative CppStructOps->PostSerialize(Ar, Value); } }