UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ArchiveReplaceObjectRef.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
7#include "UObject/Object.h"
9
12{
13public:
14
18 int64 GetCount() const { return Count; }
19
23 const UObject* GetSearchObject() const { return SearchObject; }
24
29
33 virtual FString GetArchiveName() const { return TEXT("ReplaceObjectRef"); }
34
35protected:
36
37 template <typename ContainerType, typename ElementToObjectType>
39 {
40 if (Obj.IsResolved())
41 {
42 return false;
43 }
44
46 {
49 {
50 bCanIgnoreUnresolvedImportsLocal = true; // Will be set to false if any of the criteria in the loop below are met.
51 for (const auto& ReplacementElem : ReplacementContainer)
52 {
54 {
55 if (ReplacementObject->GetOutermost() != GetTransientPackage())
56 {
58 break;
59 }
60 }
61 }
62 }
64 }
65
67 {
68 return true;
69 }
70
71 if (UClass* ReferenceClass = Obj.GetClass())
72 {
74 for (const auto& ReplacementElem : ReplacementContainer)
75 {
77 {
78 if (ReplacementObject->IsA(ReferenceClass) || Obj.IsA(ReplacementObject->GetClass()))
79 {
81 break;
82 }
83 }
84 }
86 {
87 return true;
88 }
89 }
90
91 return false;
92 }
93
98
101
104
107
110
113
116
119
125
130};
131
133{
134 None = 0,
135
136 // References to non-public objects not contained within the SearchObject should be set to null
137 NullPrivateRefs = 1 << 0,
138
139 // Do not replace Outer pointers on Objects.
140 IgnoreOuterRef = 1 << 1,
141
142 // Do not replace the ObjectArchetype reference on Objects.
143 IgnoreArchetypeRef = 1 << 2,
144
145 // Prevent the constructor from starting the process. Allows child classes to do initialization stuff in their constructor.
146 DelayStart = 1 << 3,
147
148 // Replace the ClassGeneratedBy reference in UClass
150
151 // Populate the map of referencing objects to referencing properties
153};
155
156/*----------------------------------------------------------------------------
157 FArchiveReplaceObjectRef.
158----------------------------------------------------------------------------*/
167template< class T >
169{
170public:
198
199 UE_DEPRECATED(5.0, "Use version that supplies flags via enum.")
218
223 {
224 ReplacedReferences.Reset();
225
227 && (ReplacementMap.Num() > 0 || bNullPrivateReferences))
228 {
229 // start the initial serialization
233 for (int32 Iter = 0; Iter < PendingSerializationObjects.Num(); Iter++)
234 {
237 }
239 }
240 }
241
245 virtual FArchive& operator<<( UObject*& Obj ) override
246 {
247 if (Obj != NULL)
248 {
249 // If these match, replace the reference
250 if (T* const* ReplaceWith = (T* const*)((const TMap<UObject*, UObject*>*)&ReplacementMap)->Find(Obj))
251 {
252 Obj = *ReplaceWith;
254 {
256 }
257 Count++;
258 }
259 // A->IsIn(A) returns false, but we don't want to NULL that reference out, so extra check here.
260 else if ( Obj == SearchObject || Obj->IsIn(SearchObject) )
261 {
262#if 0
263 // DEBUG: Log when we are using the A->IsIn(A) path here.
264 if(Obj == SearchObject)
265 {
266 FString ObjName = Obj->GetPathName();
267 UE_LOG(LogSerialization, Log, TEXT("FArchiveReplaceObjectRef: Obj == SearchObject : '%s'"), *ObjName );
268 }
269#endif
270 bool bAlreadyAdded = false;
272 if (!bAlreadyAdded)
273 {
274 // No recursion
276 }
277 }
278 else if ( bNullPrivateReferences && !Obj->HasAnyFlags(RF_Public) )
279 {
280 Obj = NULL;
281 }
282 }
283 return *this;
284 }
285
290 {
292 {
293 return ReplacementPair.Key;
294 }))
295 {
296 return *this;
297 }
298
299 // Allow object references to go through the normal code path of resolving and running the raw pointer code path
301 }
302
304 {
305 if (UObject* Obj = Value.ResolveObject())
306 {
307 *this << Obj;
308 Value = Obj;
309 }
310 else
311 {
313 }
314 return *this;
315 }
316
317protected:
320
321};
322
323
#define NULL
Definition oodle2base.h:134
EArchiveReplaceObjectFlags
Definition ArchiveReplaceObjectRef.h:133
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
return true
Definition ExternalRpcRegistry.cpp:601
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
UPackage * GetTransientPackage()
Definition Obj.cpp:5819
@ RF_Public
Object is visible outside its package.
Definition ObjectMacros.h:559
Definition ArchiveReplaceObjectRef.h:12
COREUOBJECT_API const TMap< UObject *, TArray< FProperty * > > & GetReplacedReferences() const
Definition ArchiveUObject.cpp:281
bool bTrackReplacedReferences
Definition ArchiveReplaceObjectRef.h:118
virtual FString GetArchiveName() const
Definition ArchiveReplaceObjectRef.h:33
TOptional< bool > CanIgnoreUnresolvedImports
Definition ArchiveReplaceObjectRef.h:129
TMap< UObject *, TArray< FProperty * > > ReplacedReferences
Definition ArchiveReplaceObjectRef.h:115
TArray< UObject * > PendingSerializationObjects
Definition ArchiveReplaceObjectRef.h:112
const UObject * GetSearchObject() const
Definition ArchiveReplaceObjectRef.h:23
TSet< UObject * > SerializedObjects
Definition ArchiveReplaceObjectRef.h:109
bool ShouldSkipReplacementCheckForObjectPtr(FObjectPtr &Obj, const ContainerType &ReplacementContainer, const ElementToObjectType &ElementToObject)
Definition ArchiveReplaceObjectRef.h:38
bool bNullPrivateReferences
Definition ArchiveReplaceObjectRef.h:124
UObject * SearchObject
Definition ArchiveReplaceObjectRef.h:100
UObject * SerializingObject
Definition ArchiveReplaceObjectRef.h:103
int32 Count
Definition ArchiveReplaceObjectRef.h:106
int64 GetCount() const
Definition ArchiveReplaceObjectRef.h:18
virtual COREUOBJECT_API void SerializeObject(UObject *ObjectToSerialize)
Definition ArchiveUObject.cpp:287
Definition ArchiveReplaceObjectRef.h:169
FArchive & operator<<(FObjectPtr &Obj)
Definition ArchiveReplaceObjectRef.h:289
const TMap< T *, T * > & ReplacementMap
Definition ArchiveReplaceObjectRef.h:319
void SerializeSearchObject()
Definition ArchiveReplaceObjectRef.h:222
virtual FArchive & operator<<(FSoftObjectPath &Value) override
Definition ArchiveReplaceObjectRef.h:303
virtual FArchive & operator<<(UObject *&Obj) override
Definition ArchiveReplaceObjectRef.h:245
FArchiveReplaceObjectRef(UObject *InSearchObject, const TMap< T *, T * > &InReplacementMap, EArchiveReplaceObjectFlags Flags=EArchiveReplaceObjectFlags::None)
Definition ArchiveReplaceObjectRef.h:178
Definition ArchiveUObject.h:17
Definition Archive.h:1208
uint8 ArIgnoreArchetypeRef
Definition Archive.h:894
UE_FORCEINLINE_HINT class FProperty * GetSerializedProperty() const
Definition Archive.h:748
uint8 ArIsObjectReferenceCollector
Definition Archive.h:915
friend FArchive & operator<<(FArchive &Ar, ANSICHAR &Value)
Definition Archive.h:1387
uint8 ArIgnoreOuterRef
Definition Archive.h:903
uint8 ArIsModifyingWeakAndStrongReferences
Definition Archive.h:918
uint8 ArIgnoreClassGeneratedByRef
Definition Archive.h:906
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition UnrealString.h.inl:34
Definition Class.h:3793
COREUOBJECT_API bool IsIn(const UObject *SomeOuter) const
Definition UObjectBaseUtility.cpp:344
COREUOBJECT_API FString GetPathName(const UObject *StopOuter=NULL) const
Definition UObjectBaseUtility.cpp:38
bool HasAnyFlags(EObjectFlags FlagsToCheck) const
Definition UObjectBaseUtility.h:93
Definition Object.h:95
@ false
Definition radaudio_common.h:23
Definition ObjectPtr.h:55
COREUOBJECT_API bool IsA(const UClass *SomeBase) const
Definition ObjectPtr.cpp:252
FORCEINLINE bool IsResolved() const
Definition ObjectPtr.h:186
FORCEINLINE UClass * GetClass() const
Definition ObjectPtr.h:109
Definition SoftObjectPath.h:56
Definition Optional.h:131
constexpr OptionalType & GetValue()
Definition Optional.h:443
constexpr bool IsSet() const
Definition Optional.h:69
Definition Tuple.h:652