UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TransactionCommon.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"
6#include "UObject/Object.h"
7#include "UObject/ObjectPtr.h"
11#include "Templates/TypeHash.h"
14
16
17namespace UE::Transaction
18{
19
33{
34public:
36 ENGINE_API explicit FPersistentObjectRef(UObject* InObject);
37
39 {
40 Ar << *this;
41 return true;
42 }
43
44 friend FArchive& operator<<(FArchive& Ar, FPersistentObjectRef& ReferencedObject)
45 {
46 Ar << (std::underlying_type_t<EReferenceType>&)ReferencedObject.ReferenceType;
47 Ar << ReferencedObject.RootObject;
48 Ar << ReferencedObject.SubObjectHierarchyIDs;
49 return Ar;
50 }
51
53 {
54 return LHS.ReferenceType == RHS.ReferenceType
55 && LHS.RootObject == RHS.RootObject
56 && (LHS.ReferenceType != EReferenceType::SubObject || LHS.SubObjectHierarchyIDs == RHS.SubObjectHierarchyIDs);
57 }
58
60 {
61 return !(LHS == RHS);
62 }
63
65 {
66 return HashCombine(::GetTypeHash(InObjRef.ReferenceType), GetTypeHash(InObjRef.RootObject));
67 }
68
70 {
71 return ReferenceType == EReferenceType::RootObject;
72 }
73
75 {
76 return ReferenceType == EReferenceType::SubObject;
77 }
78
79 ENGINE_API UObject* Get() const;
80
82
83private:
85 enum class EReferenceType : uint8
86 {
87 Unknown,
88 RootObject,
89 SubObject,
90 };
91
93 EReferenceType ReferenceType = EReferenceType::Unknown;
95 TObjectPtr<UObject> RootObject = nullptr;
97 TArray<FName, TInlineAllocator<4>> SubObjectHierarchyIDs;
98
100 mutable TWeakObjectPtr<UObject> CachedRootObject;
102 mutable TArray<TWeakObjectPtr<UObject>, TInlineAllocator<4>> CachedSubObjectHierarchy;
103};
104
106{
107public:
110
111 ENGINE_API void AppendSerializedData(const int64 InOffset, const int64 InSize);
113
114 ENGINE_API bool HasSerializedData() const;
115
117 {
118 return DataOffset;
119 }
120
121 int64 GetEnd() const
122 {
123 return DataOffset + DataSize;
124 }
125
127 {
128 return LHS.DataOffset == RHS.DataOffset
129 && LHS.DataSize == RHS.DataSize;
130 }
131
133 {
134 return !(LHS == RHS);
135 }
136
139
142};
143
145{
146public:
148 {
149 Ar << *this;
150 return true;
151 }
152
153 friend FArchive& operator<<(FArchive& Ar, FSerializedObjectData& SerializedData)
154 {
155 Ar << SerializedData.Data;
156 return Ar;
157 }
158
160 {
161 return LHS.Data == RHS.Data;
162 }
163
165 {
166 return !(LHS == RHS);
167 }
168
169 ENGINE_API void Read(void* Dest, int64 Offset, int64 Num) const;
170 ENGINE_API void Write(const void* Src, int64 Offset, int64 Num);
171
172 const void* GetPtr(int64 Offset) const
173 {
174 return &Data[Offset];
175 }
176
177 void Reset()
178 {
179 Data.Reset();
180 }
181
182 int64 Num() const
183 {
184 return Data.Num();
185 }
186
187private:
188 TArray64<uint8> Data;
189};
190
192{
193public:
195
196 explicit FSerializedObjectInfo(const UObject* InObject)
197 {
198 SetObject(InObject);
199 }
200
201 void SetObject(const UObject* InObject)
202 {
204 bIsPendingKill = !IsValid(InObject);
205 }
206
207 void Reset()
208 {
210 bIsPendingKill = false;
211 }
212
218
220 bool bIsPendingKill = false;
221};
222
249
293
296
299{
300public:
302
303 virtual int64 Tell() override { return Offset; }
304 virtual void Seek(int64 InPos) override { Offset = InPos; }
305 virtual int64 TotalSize() override { return SerializedObject.SerializedData.Num(); }
306
307protected:
308 ENGINE_API virtual void Serialize(void* SerData, int64 Num) override;
309
310 using FArchiveUObject::operator<<;
311 ENGINE_API virtual FArchive& operator<<(class FName& N) override;
312 ENGINE_API virtual FArchive& operator<<(class UObject*& Res) override;
313
316};
317
318namespace Internal
319{
320
323{
324public:
326
327 virtual int64 Tell() override { return Offset; }
328 virtual void Seek(int64 InPos) override { checkSlow(Offset <= SerializedData.Num()); Offset = InPos; }
329 virtual int64 TotalSize() override { return SerializedData.Num(); }
330
331protected:
332 ENGINE_API virtual void Serialize(void* SerData, int64 Num) override;
333
334 virtual void OnDataSerialized(int64 InOffset, int64 InNum) {}
335
338};
339
340} // namespace Internal
341
359
362{
363public:
365
366protected:
368
369 ENGINE_API bool DoesObjectMatchDiffableObject(const UObject* Obj) const;
370
371 ENGINE_API virtual bool ShouldSkipProperty(const FProperty* InProperty) const override;
372
373 ENGINE_API virtual void MarkScriptSerializationStart(const UObject* Obj) override;
374 ENGINE_API virtual void MarkScriptSerializationEnd(const UObject* Obj) override;
375
376 ENGINE_API virtual void OnDataSerialized(int64 InOffset, int64 InNum) override;
377
378 using FArchiveUObject::operator<<;
379 ENGINE_API virtual FArchive& operator<<(class FName& N) override;
380 ENGINE_API virtual FArchive& operator<<(class UObject*& Res) override;
381
382private:
383 struct FCachedPropertyKey
384 {
385 public:
387
388 private:
389 FName CachedKey;
390 uint32 LastUpdateCount = 0;
391 };
392
393 struct FCachedTaggedDataEntry
394 {
395 public:
397
398 private:
399 FName CachedKey;
400 FSerializedTaggedData* CachedEntryPtr = nullptr;
401 };
402
403 FDiffableObject& DiffableObject;
404 TArrayView<const FProperty*> PropertiesToSerialize;
405
406 bool bIsPerformingScriptSerialization = false;
407
408 mutable bool bWasUsingTaggedDataKey_UnknownData = false;
409 mutable bool bWasUsingTaggedDataKey_ScriptData = false;
410 mutable int32 TaggedDataKeyIndex_UnknownData = 0;
411 mutable int32 TaggedDataKeyIndex_ScriptData = 0;
412 mutable FCachedPropertyKey CachedSerializedTaggedPropertyKey;
413 mutable FCachedTaggedDataEntry CachedSerializedTaggedDataEntry;
414};
415
416namespace DiffUtil
417{
419
420enum class EGetDiffableObjectMode : uint8
421{
423 SerializeObject,
424
426 SerializeProperties,
427
429 Custom,
430};
431
432struct FGetDiffableObjectOptions
433{
435 EGetDiffableObjectMode ObjectSerializationMode = EGetDiffableObjectMode::SerializeObject;
436
438 TFunction<void(FDiffableObjectDataWriter&)> CustomSerializer;
439
441 TArrayView<const FProperty*> PropertiesToSerialize;
442
444 bool bSerializeEvenIfPendingKill = false;
445};
446
450ENGINE_API FDiffableObject GetDiffableObject(const UObject* Object, const FGetDiffableObjectOptions& Options = FGetDiffableObjectOptions());
451
452struct FGenerateObjectDiffOptions
453{
454 FGenerateObjectDiffOptions()
455 {
456 ArchetypeOptions.bSerializeEvenIfPendingKill = true;
457 }
458
460 FGetDiffableObjectOptions ArchetypeOptions;
461
463 TFunction<bool(FName)> ShouldSkipProperty;
464
466 bool bFullDiff = true;
467
474 bool bDiffDataEvenIfPendingKill = false;
475};
476
478class FDiffableObjectArchetypeCache
479{
480public:
481 const FDiffableObject& GetArchetypeDiffableObject(const UObject* Archetype, const FGetDiffableObjectOptions& Options);
482
483private:
484 TMap<const UObject*, FDiffableObject> ArchetypeDiffableObjects;
485};
486
490ENGINE_API FTransactionObjectDeltaChange GenerateObjectDiff(const FDiffableObject& OldDiffableObject, const FDiffableObject& NewDiffableObject, const FGenerateObjectDiffOptions& DiffOptions = FGenerateObjectDiffOptions(), FDiffableObjectArchetypeCache* ArchetypeCache = nullptr);
491ENGINE_API void GenerateObjectDiff(const FDiffableObject& OldDiffableObject, const FDiffableObject& NewDiffableObject, FTransactionObjectDeltaChange& OutDeltaChange, const FGenerateObjectDiffOptions& DiffOptions = FGenerateObjectDiffOptions(), FDiffableObjectArchetypeCache* ArchetypeCache = nullptr);
492
493} // namespace DiffUtil
494
495} // namespace UE::Transaction
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define checkSlow(expr)
Definition AssertionMacros.h:332
@ INDEX_NONE
Definition CoreMiscDefines.h:150
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
@ Num
Definition MetalRHIPrivate.h:234
const bool
Definition NetworkReplayStreaming.h:178
EObjectFlags
Definition ObjectMacros.h:552
@ RF_NoFlags
No flags, used to avoid a cast.
Definition ObjectMacros.h:555
constexpr uint32 HashCombine(uint32 A, uint32 C)
Definition TypeHash.h:36
UE_REWRITE constexpr void Exchange(T &A, T &B)
Definition UnrealTemplate.h:627
uint32 Offset
Definition VulkanMemory.cpp:4033
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ArchiveUObject.h:17
Definition Archive.h:1208
Definition NameTypes.h:617
Definition UnrealType.h:174
Definition UObjectGlobals.h:2492
Definition ArrayView.h:139
Definition Array.h:670
void Reset(SizeType NewSize=0)
Definition Array.h:2246
Definition AndroidPlatformMisc.h:14
Definition UnrealString.h.inl:34
Definition ContainerAllocationPolicies.h:894
Definition SortedMap.h:20
Definition TransactionCommon.h:362
virtual ENGINE_API bool ShouldSkipProperty(const FProperty *InProperty) const override
Definition TransactionCommon.cpp:366
virtual ENGINE_API void OnDataSerialized(int64 InOffset, int64 InNum) override
Definition TransactionCommon.cpp:393
ENGINE_API FName GetTaggedDataKey() const
Definition TransactionCommon.cpp:318
virtual ENGINE_API void MarkScriptSerializationEnd(const UObject *Obj) override
Definition TransactionCommon.cpp:383
ENGINE_API bool DoesObjectMatchDiffableObject(const UObject *Obj) const
Definition TransactionCommon.cpp:359
friend FArchive & operator<<(FArchive &Ar, ANSICHAR &Value)
Definition Archive.h:1387
virtual ENGINE_API void MarkScriptSerializationStart(const UObject *Obj) override
Definition TransactionCommon.cpp:373
Definition TransactionCommon.h:299
virtual int64 Tell() override
Definition TransactionCommon.h:303
virtual void Seek(int64 InPos) override
Definition TransactionCommon.h:304
int64 Offset
Definition TransactionCommon.h:315
friend FArchive & operator<<(FArchive &Ar, ANSICHAR &Value)
Definition Archive.h:1387
virtual int64 TotalSize() override
Definition TransactionCommon.h:305
const FSerializedObject & SerializedObject
Definition TransactionCommon.h:314
Definition TransactionCommon.h:344
TMap< UObject *, int32 > ObjectMap
Definition TransactionCommon.h:356
FSerializedObject & SerializedObject
Definition TransactionCommon.h:353
friend FArchive & operator<<(FArchive &Ar, ANSICHAR &Value)
Definition Archive.h:1387
int64 Offset
Definition TransactionCommon.h:354
TMap< FName, int32 > NameMap
Definition TransactionCommon.h:357
FSerializedObjectData & SerializedData
Definition TransactionCommon.h:336
virtual int64 Tell() override
Definition TransactionCommon.h:327
virtual int64 TotalSize() override
Definition TransactionCommon.h:329
int64 Offset
Definition TransactionCommon.h:337
virtual void Seek(int64 InPos) override
Definition TransactionCommon.h:328
virtual void OnDataSerialized(int64 InOffset, int64 InNum)
Definition TransactionCommon.h:334
FORCEINLINE EObjectFlags GetFlags() const
Definition UObjectBase.h:285
Definition Object.h:95
COREUOBJECT_API UObject * GetArchetype() const
Definition UObjectArchetype.cpp:283
Definition ByteSwap.h:14
FDiffableObject GetDiffableObject(const UObject *Object, const FGetDiffableObjectOptions &Options)
Definition TransactionCommon.cpp:456
bool IsGeneratingDiffableObject(const FArchive &Ar)
Definition TransactionCommon.cpp:451
FTransactionObjectDeltaChange GenerateObjectDiff(const FDiffableObject &OldDiffableObject, const FDiffableObject &NewDiffableObject, const FGenerateObjectDiffOptions &DiffOptions, FDiffableObjectArchetypeCache *ArchetypeCache)
Definition TransactionCommon.cpp:590
Definition TransactionCommon.cpp:9
const FName TaggedDataKey_UnknownData
Definition TransactionCommon.cpp:194
const FName TaggedDataKey_ScriptData
Definition TransactionCommon.cpp:195
Definition ArchiveSerializedPropertyChain.h:9
Definition TransactionObjectEvent.h:15
Definition TransactionObjectEvent.h:62
COREUOBJECT_API void SetObject(const UObject *Object)
Definition TransactionObjectEvent.cpp:9
void Swap(FTransactionObjectId &Other)
Definition TransactionObjectEvent.h:93
void Reset()
Definition TransactionObjectEvent.h:83
Definition ObjectPtr.h:488
Definition WeakObjectPtrTemplates.h:25
Definition TransactionCommon.h:251
FSerializedObjectData SerializedData
Definition TransactionCommon.h:288
EObjectFlags ObjectFlags
Definition TransactionCommon.h:285
FPersistentObjectRef ObjectArchetype
Definition TransactionCommon.h:282
void Swap(FDiffableObject &Other)
Definition TransactionCommon.h:269
TSortedMap< FName, FSerializedTaggedData, FDefaultAllocator, FNameFastLess > SerializedTaggedData
Definition TransactionCommon.h:291
void SetObject(const UObject *InObject)
Definition TransactionCommon.h:253
void Reset()
Definition TransactionCommon.h:260
FSerializedObjectInfo ObjectInfo
Definition TransactionCommon.h:279
Definition TransactionCommon.h:33
friend FArchive & operator<<(FArchive &Ar, FPersistentObjectRef &ReferencedObject)
Definition TransactionCommon.h:44
ENGINE_API UObject * Get() const
Definition TransactionCommon.cpp:59
friend uint32 GetTypeHash(const FPersistentObjectRef &InObjRef)
Definition TransactionCommon.h:64
ENGINE_API void AddReferencedObjects(FReferenceCollector &Collector)
Definition TransactionCommon.cpp:122
friend bool operator!=(const FPersistentObjectRef &LHS, const FPersistentObjectRef &RHS)
Definition TransactionCommon.h:59
friend bool operator==(const FPersistentObjectRef &LHS, const FPersistentObjectRef &RHS)
Definition TransactionCommon.h:52
bool IsSubObjectReference() const
Definition TransactionCommon.h:74
bool IsRootObjectReference() const
Definition TransactionCommon.h:69
bool Serialize(FArchive &Ar)
Definition TransactionCommon.h:38
Definition TransactionCommon.h:145
friend bool operator==(const FSerializedObjectData &LHS, const FSerializedObjectData &RHS)
Definition TransactionCommon.h:159
void Reset()
Definition TransactionCommon.h:177
friend FArchive & operator<<(FArchive &Ar, FSerializedObjectData &SerializedData)
Definition TransactionCommon.h:153
int64 Num() const
Definition TransactionCommon.h:182
const void * GetPtr(int64 Offset) const
Definition TransactionCommon.h:172
friend bool operator!=(const FSerializedObjectData &LHS, const FSerializedObjectData &RHS)
Definition TransactionCommon.h:164
bool Serialize(FArchive &Ar)
Definition TransactionCommon.h:147
Definition TransactionCommon.h:192
void Reset()
Definition TransactionCommon.h:207
void Swap(FSerializedObjectInfo &Other)
Definition TransactionCommon.h:213
FSerializedObjectInfo(const UObject *InObject)
Definition TransactionCommon.h:196
bool bIsPendingKill
Definition TransactionCommon.h:220
void SetObject(const UObject *InObject)
Definition TransactionCommon.h:201
Definition TransactionCommon.h:224
void Reset()
Definition TransactionCommon.h:226
TArray< FName > ReferencedNames
Definition TransactionCommon.h:247
FSerializedObjectData SerializedData
Definition TransactionCommon.h:241
TArray< FPersistentObjectRef > ReferencedObjects
Definition TransactionCommon.h:244
void Swap(FSerializedObject &Other)
Definition TransactionCommon.h:233
Definition TransactionCommon.h:106
static ENGINE_API FSerializedTaggedData FromStartAndEnd(const int64 InStart, const int64 InEnd)
Definition TransactionCommon.cpp:145
int64 DataOffset
Definition TransactionCommon.h:138
int64 GetStart() const
Definition TransactionCommon.h:116
ENGINE_API bool HasSerializedData() const
Definition TransactionCommon.cpp:172
ENGINE_API void AppendSerializedData(const int64 InOffset, const int64 InSize)
Definition TransactionCommon.cpp:150
friend bool operator==(const FSerializedTaggedData &LHS, const FSerializedTaggedData &RHS)
Definition TransactionCommon.h:126
int64 DataSize
Definition TransactionCommon.h:141
static ENGINE_API FSerializedTaggedData FromOffsetAndSize(const int64 InOffset, const int64 InSize)
Definition TransactionCommon.cpp:140
int64 GetEnd() const
Definition TransactionCommon.h:121
friend bool operator!=(const FSerializedTaggedData &LHS, const FSerializedTaggedData &RHS)
Definition TransactionCommon.h:132