(UE4.26)UE4的FArchive序列化入门

news2024/11/15 17:28:28

前言

序列化(Serialize)反序列化(UnSerialize)是程序领域常见的概念。对于这两个词汇我理解的是

序列化(Serialize): 变量值(int, float, string等基本类型, 或者ArrayMap,或者更复杂的复合体)存储为一个文件(二进制流, 二进制文件, json, xml等格式)。

反序列化(UnSerialize): 读取文件来复原变量值。

UE4的序列化

FArchive简介

UE4的序列化一个比较核心类是FArchive, 这个类定义了对大部分基础变量类型的序列化和反序列化接口。这里得注意是FArchive的operator<<接口既包含了序列化,也包含了反序列化。判断是operator<< 此时运行的状态是序列化还是反序列化可以通过接口IsLoading(反序列化)IsSaving(序列化)。这些接口不一定有实际的实现, 很多实现是在FArchive子类里。

FArchive核心接口--void Serialize(void* V, int64 Length)

这个接口是大多数类型序列化的底层,主要是面向一段内存进行读/写FArchive.

我们自定义复杂类型的数据序列化时经常和这个接口打交道. 得注意的是Length是内存byte的个数。用法和FMemory::Copy类似。

UObject序列化

UObject的序列化也是通过FArchive, UObject被UProperty标记的变量会自动参与到序列化中。背后有一套管理机制,后续再深入篇在分析。

UObject序列化接口--void Serialize(FArchive& Ar)
virtual void Serialize(FArchive& Ar);

保存和加载UObject对象都会触发Serialize, 对于UObject未被UProperty标记的变量,又需要存储到UObject的,可以Override这个接口来自定义

对复杂类型变量自定义序列化

对于部分复杂变量类型, FArchive接口和UE其他模块没有提供的。我们只能手动自定义序列化流程.

变量类型序列化也是分解为上门的基础序列化接口.

下面讲两个经典案例

案例一: 自定义Struct序列化
struct TestStruct
{
    int a;
    float c;
}

FArchive Ar;
TestStruct test;

// 调用 FArchive& operator << (int& value)
Ar << test.a; 

// 调用 FArchive& operator << (float& value)
Ar << test.c;
案例二: TArray<int32>数组序列化

对于一个UObject里没有被UPROPERTY标记的TArray<int32>序列化。

UCLASS()
class TESTARCH_API ATest : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ATest();
	
	UFUNCTION(CallInEditor)
	void TestWrite();

	UFUNCTION(CallInEditor)
	void TestPrint();

	TArray<int32> Data;
	
public:
	virtual void Serialize(FArchive& Ar) override;
};
// Sets default values
ATest::ATest()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
}

void ATest::TestWrite()
{
	Data.Empty();

	for(int32 Index = 0; Index < 10; Index++)
	{
		Data.Add(Index);
	}
}


void ATest::TestPrint()
{
	for(int32 Index = 0; Index < 10; Index++)
	{
		if(Data.IsValidIndex(Index))
		{
			UE_LOG(LogTemp, Error, TEXT("%d"), Data[Index]);
		}
	}
}
	

void ATest::Serialize(FArchive& Ar)
{
	Super::Serialize(Ar);

	// 反序列化(加载)
	if(Ar.IsLoading())
	{
		int32 Num = 0;
		Ar << Num;

		if(Num > 0)
		{
			Data.Init(0, Num);
			Ar.Serialize(Data.GetData(), sizeof(int32) * Num);
		}
	}
	// 序列化(保存)
	else
	{
		int32 Num = Data.Num();
		Ar << Num;
		
		if(Num > 0)
		{
			Ar.Serialize(Data.GetData(), sizeof(int32) * Num);
		}
	}
};

对于很多基础类型我们经常能轻易使用 " Operator << " 就同时处理了序列化和反序列化, 这是因为UE4 FArchive底层已经帮我们处理好两种情况下的逻辑,显得很简单。但是对于FArchive接口未覆盖的复杂类型, 需要我们手动实现相应接口时, 基本是需要分为序列化和反序列化两种情况来进行处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1800606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 PAI-DSW x Free Prompt Editing图像编辑算法,开发个人AIGC绘图小助理

教程简述 在本教程中&#xff0c;您将学习在阿里云交互式建模平台PAI-DSW x Free Prompt Editing&#xff08;CVPR2024中选论文算法&#xff09;图像编辑算法&#xff0c;开发个人AIGC绘图小助理&#xff0c;实现文本驱动的图像编辑功能单卡即可完成AIGC图片风格变化、背景变化…

277 基于MATLAB GUI火灾检测系统

基于MATLAB GUI火灾检测系统&#xff0c;可以实现图片和视频的火苗检测。火焰识别的三个特征&#xff1a;1个颜色特征&#xff0c;2个几何特征颜色特征&#xff1a;HSV颜色空间下&#xff0c;对三个通道值进行阈值滤波&#xff0c;几何特征1&#xff1a;长宽比&#xff0c;几何…

k8s——pod控制器

一、pod控制器定义 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层&#xff0c;确保pod资源符合预期的状态&#xff0c;pod的资源出现故障时&#xff0c;会尝试进行重启&#xff0c;当根据重启策略无效&#xf…

NIST 电子病历中的疾病列表部分的认证

美国国家标准与技术研究院&#xff08;National Institute of Standards and Technology&#xff0c;NIST&#xff09;对电子病历的认证 分几个阶段&#xff0c;每个阶段又分门诊和住院&#xff0c;然后又分若干模块。下面是疾病列表的测试脚本。 170.302c_Problemlist Test …

(一)大数据基础练习题(66道选择题)

本文整理了大数据基础知识相关的练习题&#xff0c;共66道&#xff0c;适用于想巩固大数据基础的同学。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-大数据&#xff09;。 1&#xff09; 2&#xff09; 3&#xff09; 4&#xff09; 5&#xff09; 6&#xff09;…

高考分数查询结果自动推送至微信

又是一年高考时&#xff0c;祝各位学子金榜题名&#xff0c;天遂人愿! 在您阅读以下内容时&#xff0c;请注意&#xff1a;各省查分API接口可能不相同&#xff0c;本人仅就技术层面谈谈&#xff0c; 纯属无聊&#xff0c;因为实用意义不大&#xff0c;毕竟一年一次&#xff0c;…

【机器学习】XGBoost: 强化学习与梯度提升的杰作

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 XGBoost: 强化学习与梯度提升的杰作引言1. XGBoost概览1.1 什么是XGBoost&#…

27 ssh+scp+nfs+yum进阶

ssh远程管理 ssh是一种安全通道协议&#xff0c;用来实现字符界面的远程登录。远程复制&#xff0c;远程文本传输。 ssh对通信双方的数据进行了加密。 用户名和密码登录 密钥对认证方式&#xff08;可以实现免密登录&#xff09; ssh 22 网络层 传输层 数据传输的过程中是…

【PL理论】(8) F#:列表高阶函数之 filter 函数 | 内联谓词函数 | 链式操作:先过滤再映射

&#x1f4ad; 写在前面&#xff1a;上一章中&#xff0c;我们详细讲解了列表的合并&#xff0c;本章我们来详细讲解一下列表的过滤&#xff0c;在 F# 中&#xff0c;过滤列表是指从列表中提取满足某个条件的元素&#xff0c;形成一个新的列表。这个操作通常使用 List.filter 函…

第R3周:天气预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 &#x1f680; 文章来源&#xff1a;K同学的学习圈子 目录 我的环境 语言环境&#xff1a;python3.8.18编译器&#xff1a;jupyter not…

用HTML实现拓扑面,动态4D圆环面,可手动调节,富有创新性的案例。(有源代码)

文章目录 前言一、示例二、目录结构三、index.html&#xff08;主页面&#xff09;四、main.js五、Tour4D.js六、swissgl.js七、dat.gui.min.js八、style.css 前言 如果你觉得对代码进行复制粘贴很麻烦的话&#xff0c;你可以直接将资源下载到本地。无需部署&#xff0c;直接可…

如何利用Varjo混合现实技术改变飞机维修训练方式

自2017年以来&#xff0c;总部位于休斯顿的HTX实验室一直在推进混合现实技术&#xff0c;与美国空军密切合作&#xff0c;通过其EMPACT平台提供可扩展的沉浸式飞机维护虚拟现实培训。 虚拟和混合现实对维修训练的好处&#xff1a; l 实践技能&#xff1a;提供一个非常接近真实场…

独享IP VS 原生IP,二者的区别与定义详解

原生IP&#xff1a;原生IP是指由Internet服务提供商&#xff08;ISP&#xff09;直接分配给用户的IP地址&#xff0c;这些IP地址通常反映了用户的实际地理位置和网络连接。原生IP是用户在其所在地区或国家使用的真实IP地址&#xff0c;与用户的物理位置直接相关。在跨境电商中&…

Liunx环境下redis主从集群搭建(保姆级教学)02

Redis在linux下的主从集群配置 本次演示使用三个节点实例一个主节点&#xff0c;两个从节点&#xff1a;7000端口&#xff08;主&#xff09;&#xff0c;7001端口&#xff08;从&#xff09;&#xff0c;7002端口&#xff08;从&#xff09;&#xff1b; 主节点负责写数据&a…

Ghost Mirror

Ghost Mirror 操作系统镜像 windows servers linux Windows XP 老古董&#xff0c;唉 安装完重启一下 设置下BIOS 1小时内弄完3台。。。

【MMU】——页表映射示例

文章目录 页表映射示例一级页表二级页表二级页表的优势页表映射示例 一级页表 上图一级页表中假设以 4KB 物理页为映射单位,一个进程 4GB 的虚拟地址空间需要:4GB/4KB = 1MB 个页表项,每个页表项目占用 4 个字节所以每个一级页表需要 4MB 的存储空间,每个进程需要 4MB 的内…

ARM32开发--GPIO--LED驱动开发

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 需求介绍 现实问题 需求分析 测试案例构建 BSP驱动构建 接口定义 业务实现 总结 前言 前言&#xff1a; 在这个快节奏的开发环境中&#xff0c;面对紧迫的项目截止日期和有限的资源&#xff0c;我们作为软…

BC9 printf的返回值

BC9 printf的返回值 这里我们先要了解库函数printf printf的返回值&#xff0c;是写入的字符总数 我们第一遍写代码时候可能写成这样: #include<stdio.h> int main() {int retprintf("Hello world!");printf("%d", ret);return 0; }我们发现这样是通…

MPU6050篇——姿态解算,卡尔曼滤波

一、DMP文件的修改&#xff1a; 首先我们打开inv_mpu.c文件夹&#xff0c;如下图所示便是第一个要修改的地方&#xff1a; 我们将其修改为&#xff1a;define定义可以改为自己使用的型号的单片机。 修改后在上面定义这个宏&#xff0c;并加上一个MPU6050的宏&#xff0c;用于源…

算法005:有效三角形的个数

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/valid-triangle-number/ 要组成三角形的三条边&#xff0c;需要保证&am…