UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
LinkerSave.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6#include "Containers/Array.h"
7#include "Containers/Map.h"
8#include "Containers/Set.h"
11#include "CoreMinimal.h"
12#include "CoreTypes.h"
13#include "IO/IoHash.h"
18#include "Templates/Function.h"
20#include "Templates/UniquePtr.h"
21#include "UObject/Linker.h"
22#include "UObject/NameTypes.h"
27
28class FBulkData;
30class FOutputDevice;
31class FPackagePath;
32class UObject;
33class UPackage;
34class FSaveContext;
35namespace UE { class FDerivedData; }
36namespace UE { class FPackageTrailerBuilder; }
37struct FLazyObjectPtr;
39
40/*----------------------------------------------------------------------------
41 FLinkerSave.
42----------------------------------------------------------------------------*/
43
47class FLinkerSave : public FLinker, public FArchiveUObject
48{
49public:
50
55
56 virtual ~FLinkerSave();
57
58 // Variables.
60 FArchive* Saver = nullptr;
61
65
69
72
73 /* Map from FName to the index of the name in the name array written into the package header. */
75
76 /* Map from FSoftObjectPath to the index of the path in the soft object path array written into the package header. */
78
81
83
100
106 bool bProceduralSave = false;
107
114
116 bool bRehydratePayloads = false;
117
123
126
129
138
140 UE_DEPRECATED(5.6, "No longer supported, contact Epic if you need this functionality.")
142
144 UE_DEPRECATED(5.6, "Use constructor that takes only Parent and then call AssignFileSaver.")
145 FLinkerSave(UPackage* InParent, const TCHAR* InFilename, bool bForceByteSwapping, bool bInSaveUnversioned = false );
147 UE_DEPRECATED(5.6, "Use constructor that takes only Parent and then call AssignMemorySaver.")
148 FLinkerSave(UPackage* InParent, bool bForceByteSwapping, bool bInSaveUnversioned = false );
150 UE_DEPRECATED(5.6, "Use constructor that takes only Parent and then call AssignSaver.")
151 FLinkerSave(UPackage* InParent, FArchive *InSaver, bool bForceByteSwapping, bool bInSaveUnversioned = false);
152
157 explicit FLinkerSave(UPackage* InParent);
158
169 void AssignSaver(FArchive* InSaver, bool bForceByteSwapping, bool bInSaveUnversioned = false);
171 void AssignMemorySaver(bool bForceByteSwapping, bool bInSaveUnversioned = false);
179 bool TryAssignFileSaver(FStringView InFilename, bool bForceByteSwapping, bool bInSaveUnversioned = false);
180
185 {
186 SaveContext = InContext;
187 }
188
191
194
197
201 virtual void MarkScriptSerializationStart(const UObject* Obj) override;
202
206 virtual void MarkScriptSerializationEnd(const UObject* Obj) override;
207
208 // FArchive interface.
209 using FArchiveUObject::operator<<; // For visibility of the overloads we don't override
210 virtual FArchive& operator<<(FName& InName) override;
211 virtual FArchive& operator<<(UObject*& Obj) override;
212 virtual FArchive& operator<<(FObjectPtr& Value) override;
213#if WITH_VERSE_VM || defined(__INTELLISENSE__)
214 virtual FArchive& operator<<(Verse::VCell*& Cell) override;
215#endif
218 virtual bool ShouldSkipProperty(const FProperty* InProperty) const override;
219 UE_DEPRECATED(5.5, "GetSerializeContext is not supported. Use FUObjectThreadContext::Get().GetSerializeContext().")
220 FUObjectSerializeContext* GetSerializeContext() override;
225
228 {
229 TransientPropertyOverrides = &InTransientPropertyOverrides;
230 }
231
234 {
235 MemoryMappingAlignment = InAlignment;
236 }
237
239 void SetFileRegionsEnabled(bool bEnabled)
240 {
241 bFileRegionsEnabled = bEnabled;
242 }
243
246 {
247 bDeclareRegionForEachAdditionalFile = bValue;
248 }
249
252 {
253 bSaveBulkDataByReference = bValue;
254 }
255
258 {
259 bSaveBulkDataToSeparateFiles = bValue;
260 }
261
262#if WITH_EDITOR
263 // proxy for debugdata
264 virtual void PushDebugDataString(const FName& DebugData) override { Saver->PushDebugDataString(DebugData); }
265 virtual void PopDebugDataString() override { Saver->PopDebugDataString(); }
266#endif
267
268 virtual FString GetArchiveName() const override;
269
273 virtual FLinker* GetLinker() { return this; }
274
275 void Seek( int64 InPos );
276 int64 Tell();
277 // this fixes the warning : 'FLinkerSave::Serialize' hides overloaded virtual function
278 using FLinker::Serialize;
279 void Serialize( void* V, int64 Length );
280
282 void OnPostSave(const FPackagePath& PackagePath, FObjectPostSaveContext ObjectSaveContext);
283
285 void OnPostSaveBulkData();
286
287 virtual void SetSerializedProperty(FProperty* InProperty) override;
289 class FProperty* InSerializedPropertyOverride = nullptr) override;
290 virtual void PushSerializedProperty(class FProperty* InProperty, const bool bIsEditorOnlyProperty) override;
291 virtual void PopSerializedProperty(class FProperty* InProperty, const bool bIsEditorOnlyProperty) override;
292#if WITH_EDITORONLY_DATA
293 virtual bool IsEditorOnlyPropertyOnTheStack() const override;
294#endif
295
296 // FLinker interface
297 virtual FString GetDebugName() const override;
298
299 // FLinkerSave interface
305
307 const FString& GetFilename() const;
308
309 /* Set the output device used to log errors, if any. */
311 {
312 LogOutput = InOutputDevice;
313 }
314
315 /* Returns an output Device that can be used to log info, warnings and errors etc. */
317 {
318 return LogOutput;
319 }
320
321#if WITH_EDITORONLY_DATA
328#endif // WITH_EDITORONLY_DATA
329
330 virtual bool SerializeBulkData(FBulkData& BulkData, const FBulkDataSerializationParams& Params) override;
331
333
337
338 bool HasCookedIndexBulkData() const;
339
340 UE_DEPRECATED(5.5, "Use the overload that takes a FBulkDataCookedIndex")
345
346 UE_DEPRECATED(5.5, "Use the overload that takes a FBulkDataCookedIndex")
351
352 UE_DEPRECATED(5.5, "Use the overload that takes a FBulkDataCookedIndex")
357
358protected:
361
363
365
366 void AssignSaverInternal(FArchive* InSaver, bool bForceByteSwapping, bool bInSaveUnversioned);
367
368private:
370 FSaveContext* SaveContext = nullptr;
372 FOutputDevice* LogOutput = nullptr;
373
374#if WITH_EDITORONLY_DATA
377#endif
378
379#if WITH_EDITOR
382#endif //WITH_EDITOR
383
385 TMap<FBulkDataCookedIndex, TUniquePtr<FFileRegionMemoryWriter>> BulkDataAr; // Can't use TUniqueObj as FFileRegionMemoryWriter isn't movable
390
392 FString Filename;
393
394 const TMap<UObject*, TSet<FProperty*>>* TransientPropertyOverrides = nullptr;
396 int64 MemoryMappingAlignment = -1;
398 bool bFileRegionsEnabled = false;
400 bool bDeclareRegionForEachAdditionalFile = false;
402 bool bSaveBulkDataByReference = false;
404 bool bSaveBulkDataToSeparateFiles = false;
405};
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
EBulkDataPayloadType
Definition BulkDataCookedIndex.h:25
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
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 BulkDataCookedIndex.h:34
static COREUOBJECT_API const FBulkDataCookedIndex Default
Definition BulkDataCookedIndex.h:42
Definition BulkData.h:470
Definition CompressedBuffer.h:50
Definition LinkerSave.h:48
FPackageIndex CurrentlySavingExport
Definition LinkerSave.h:62
TMap< TObjectPtr< UObject >, FPackageIndex > ObjectIndicesMap
Definition LinkerSave.h:67
TMap< FNameEntryId, int32 > NameIndices
Definition LinkerSave.h:74
UObject * CurrentlySavingExportObject
Definition LinkerSave.h:63
void ForEachBulkDataCookedIndex(TUniqueFunction< void(FBulkDataCookedIndex, FFileRegionMemoryWriter &)> &&Func, EBulkDataPayloadType Type) const
Definition LinkerSave.cpp:767
bool TryAssignFileSaver(FStringView InFilename, bool bForceByteSwapping, bool bInSaveUnversioned=false)
Definition LinkerSave.cpp:75
virtual FString GetArchiveName() const override
Definition LinkerSave.cpp:302
void SerializeObjectPointer(const FObjectPtr &Value)
Definition LinkerSave.cpp:363
virtual void SetFilterEditorOnly(bool bInFilterEditorOnly) override
Definition LinkerSave.cpp:510
bool bRehydratePayloads
Definition LinkerSave.h:116
virtual bool SerializeBulkData(FBulkData &BulkData, const FBulkDataSerializationParams &Params) override
Definition LinkerSave.cpp:551
int32 MapName(FNameEntryId Name) const
Definition LinkerSave.cpp:149
int64 Tell()
Definition LinkerSave.cpp:267
bool bUpdatingLoadedPath
Definition LinkerSave.h:113
virtual FLinker * GetLinker()
Definition LinkerSave.h:273
static COREUOBJECT_API TMap< FString, TArray< uint8 > > PackagesToScriptSHAMap
Definition LinkerSave.h:141
virtual void PushSerializedProperty(class FProperty *InProperty, const bool bIsEditorOnlyProperty) override
Definition LinkerSave.cpp:869
TMap< const UObject *, TArray< FName > > SearchableNamesObjectMap
Definition LinkerSave.h:71
TArray< FSidecarStorageInfo > SidecarDataToAppend
Definition LinkerSave.h:125
FFileRegionMemoryWriter & GetBulkDataArchive()
Definition LinkerSave.h:341
TMap< Verse::VCell *, FPackageIndex > CellIndicesMap
Definition LinkerSave.h:68
friend FArchive & operator<<(FArchive &Ar, ANSICHAR &Value)
Definition Archive.h:1387
virtual void SetUseUnversionedPropertySerialization(bool bInUseUnversioned) override
Definition LinkerSave.cpp:483
TArray< FFileRegion > FileRegions
Definition LinkerSave.h:82
TArray< AdditionalDataCallback > AdditionalDataToAppend
Definition LinkerSave.h:99
void SetSaveBulkDataByReference(bool bValue)
Definition LinkerSave.h:251
virtual void SetSerializedPropertyChain(const FArchiveSerializedPropertyChain *InSerializedPropertyChain, class FProperty *InSerializedPropertyOverride=nullptr) override
Definition LinkerSave.cpp:862
FOutputDevice * GetOutputDevice() const
Definition LinkerSave.h:316
bool bIsWritingHeaderSoftObjectPaths
Definition LinkerSave.h:80
void SetFilename(FStringView InFilename)
Definition LinkerSave.cpp:297
virtual void UsingCustomVersion(const struct FGuid &Guid) override
Definition LinkerSave.cpp:445
void SetTransientPropertyOverrides(const TMap< UObject *, TSet< FProperty * > > &InTransientPropertyOverrides)
Definition LinkerSave.h:227
int32 MapSoftObjectPath(const FSoftObjectPath &SoftObjectPath) const
Definition LinkerSave.cpp:161
bool HasCookedIndexBulkData() const
Definition LinkerSave.cpp:807
FFileRegionMemoryWriter & GetOptionalBulkDataArchive()
Definition LinkerSave.h:347
virtual void SetSerializedProperty(FProperty *InProperty) override
Definition LinkerSave.cpp:856
FArchive * Saver
Definition LinkerSave.h:60
void AssignSaverInternal(FArchive *InSaver, bool bForceByteSwapping, bool bInSaveUnversioned)
Definition LinkerSave.cpp:100
void OnPostSaveBulkData()
Definition LinkerSave.cpp:840
TArray< TUniqueFunction< void(const FPackagePath &PackagePath, FObjectPostSaveContext ObjectSaveContext)> > PostSaveCallbacks
Definition LinkerSave.h:137
FPackageIndex MapObject(TObjectPtr< const UObject > Object, bool bValidateExcluded=true) const
Definition LinkerSave.cpp:174
void AssignMemorySaver(bool bForceByteSwapping, bool bInSaveUnversioned=false)
Definition LinkerSave.cpp:66
virtual void PopSerializedProperty(class FProperty *InProperty, const bool bIsEditorOnlyProperty) override
Definition LinkerSave.cpp:875
void SetDeclareRegionForEachAdditionalFile(bool bValue)
Definition LinkerSave.h:245
void SetOutputDevice(FOutputDevice *InOutputDevice)
Definition LinkerSave.h:310
void SetSaveBulkDataToSeparateFiles(bool bValue)
Definition LinkerSave.h:257
void SetFileRegionsEnabled(bool bEnabled)
Definition LinkerSave.h:239
void OnPostSave(const FPackagePath &PackagePath, FObjectPostSaveContext ObjectSaveContext)
Definition LinkerSave.cpp:277
FFileRegionMemoryWriter & GetMemoryMappedBulkDataArchive()
Definition LinkerSave.h:353
TMap< FSoftObjectPath, int32 > SoftObjectPathIndices
Definition LinkerSave.h:77
TUniquePtr< UE::FPackageTrailerBuilder > PackageTrailerBuilder
Definition LinkerSave.h:128
virtual void SetDebugSerializationFlags(uint32 InCustomFlags) override
Definition LinkerSave.cpp:502
TArray< FPackageIndex > DepListForErrorChecking
Definition LinkerSave.h:64
UE_DEPRECATED(5.5, "GetSerializeContext is not supported. Use FUObjectThreadContext::Get().GetSerializeContext().") FUObjectSerializeContext *GetSerializeContext() override
bool bProceduralSave
Definition LinkerSave.h:106
virtual FString GetDebugName() const override
Definition LinkerSave.cpp:287
bool CloseAndDestroySaver()
Definition LinkerSave.cpp:137
virtual void MarkScriptSerializationStart(const UObject *Obj) override
Definition LinkerSave.cpp:244
virtual ~FLinkerSave()
Definition LinkerSave.cpp:144
virtual bool ShouldSkipProperty(const FProperty *InProperty) const override
Definition LinkerSave.cpp:427
void SetMemoryMapAlignment(int64 InAlignment)
Definition LinkerSave.h:233
void AssignSaveContext(FSaveContext *InContext)
Definition LinkerSave.h:184
void AssignSaver(FArchive *InSaver, bool bForceByteSwapping, bool bInSaveUnversioned=false)
Definition LinkerSave.cpp:60
virtual void MarkScriptSerializationEnd(const UObject *Obj) override
Definition LinkerSave.cpp:253
const TMap< FBulkDataCookedIndex, TUniquePtr< FFileRegionMemoryWriter > > & GetArchives(EBulkDataPayloadType Type) const
Definition LinkerSave.cpp:820
const FString & GetFilename() const
Definition LinkerSave.cpp:292
static UE_FORCEINLINE_HINT ELinkerType::Type StaticType()
Definition LinkerSave.h:51
Definition Linker.h:398
void Serialize(FArchive &Ar)
Definition Linker.cpp:191
Definition NameTypes.h:617
Definition ObjectSaveContext.h:459
Definition OutputDevice.h:133
Definition ObjectResource.h:44
Definition PackagePath.h:89
Definition UnrealType.h:174
Definition SaveContext.h:588
Definition Array.h:670
Definition FileRegionArchive.h:12
Definition UnrealString.h.inl:34
Definition FunctionFwd.h:19
Definition UniquePtr.h:107
Definition DerivedData.h:80
Definition Object.h:95
Definition Package.h:216
Type
Definition Linker.h:386
@ Save
Definition Linker.h:389
Definition SoftObjectPath.cpp:24
Definition AdvancedWidgetsModule.cpp:13
@ false
Definition radaudio_common.h:23
Definition ArchiveSerializedPropertyChain.h:9
Definition BulkData.h:453
Definition Guid.h:109
Definition IoHash.h:33
Definition LazyObjectPtr.h:151
Definition LinkerSave.h:119
FIoHash Identifier
Definition LinkerSave.h:120
FCompressedBuffer Payload
Definition LinkerSave.h:121
Definition NameTypes.h:69
Definition ObjectPtr.h:55
Definition SoftObjectPath.h:56
Definition UObjectThreadContext.h:140
Definition ObjectPtr.h:488