简介: 今天来梳理 序列化系统 FArchive 是序列化系统的基类,他拥有一些列的子类用来做具体实现。序列化系统有一个单独的模块,路径如下 Engine/Source/Runtime/Core/Public/Serialization
关键的序列化流程函数
- 对象序列化入口 (UObject::Serialize)
- 属性序列化核心 (SerializeTaggedProperties)
- 网络复制序列化 (UActorComponent::ReplicatedProperties)
- 资源包序列化 (FPackageWriter::WritePackage)
FArchiveState 核心函数
| 属性 |
描述 |
典型用途 |
| bIsLoading |
判断当前为读取模式 |
条件序列化逻辑 |
| bIsSaving |
判断当前为写入模式 |
条件序列化逻辑 |
| bIsTextFormat |
是否文本格式(JSON/XML) |
开发期调试 |
| ArIsNetArchive |
是否为网络序列化 |
网络优化处理 |
| ArNoDelta |
是否禁用增量序列化 |
全量数据序列化 |
| ArIsObjectReferenceCollector |
是否只收集引用 |
GC引用分析 |
主要派生类
| 类名 |
用途 |
| FMemoryReader -> FMemoryArchive
|
内存读取序列化 |
| FMemoryWriter -> TMemoryWriter<32> -> FMemoryArchive
|
内存写入序列化 |
| FObjectReader -> FMemoryArchive
|
对象状态读取(属于 UObject 模块) |
| FObjectWriter -> FMemoryArchive
|
对象状态写入(属于UObject 模块) |
| FBitReader -> FBitArchive
|
网络包读取(位操作) |
| FBitWriter -> FBitArchive
|
网络包写入(位操作) |
| FLargeMemoryReader -> FMemoryArchive
|
大内存块读取 |
| FLargeMemoryWriter -> FMemoryArchive
|
大内存块写入 |
| FPackageReader -> FArchiveUObject -> FArchive
|
资源包读取 |
| FMemoryImageWriter |
大内存块写入 |
序列化系统管理类
| 类名 |
职责 |
| FUObjectSerializeContext |
管理对象序列化状态(属于 UObject 模块) |
| FObjectAndNameAsStringProxyArchive -> FNameAsStringProxyArchive -> FArchiveProxy -> FArchive
|
处理对象引用的文本表示 |
| FSerializedPropertyScope |
作用域属性序列化 |
| FArchiveSerializedPropertyChain |
属性链序列化管理 |
阅读记录
class FArchive : private FArchiveState 继承自 一个 struct FArchiveState
FArchive 内重载了很多的 << 运算符
TArray, TMap, TSubclassOf等模板函实现在头文件中是 C++ 的标准要求
Linker是UE资源系统的神经网络负责
1. 文件 ↔ 内存的转换
2. 跨资源引用解析
3. 加载状态管理(通过ObjBeginLoadCount等
4. IO性能优化(延迟关闭、批处理)
FObjectAndNameAsStringProxyArchive 创建时会传入一个真正的 FArchive ,然后将传入的 FArchive 序列化成 string,他的**巧妙处在于,将 FArchive 放入自己内部,然后像 FArchive 一样重载 << 运算符,这样他就可以把不同类型的 FArchive 序列化成 string