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

前言

序列化(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接口未覆盖的复杂类型, 需要我们手动实现相应接口时, 基本是需要分为序列化和反序列化两种情况来进行处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CorelDRAW2024最新crack+keygen安装包下载

在数字艺术的浪潮下&#xff0c;设计师对于设计工具的需求也愈发严苛&#xff0c;他们希望有一款能够提供强大功能和灵活操作的软件来帮助他们实现更专业、更具创新力的设计。近日发布的CorelDRAW 2024正是这样一款能够满足设计师需求的专业图形设计软件。 「CorelDRAW汉化版下…

汽车EDI——Volvo EDI 项目案例

项目背景 作为Volvo的长期合作伙伴&#xff0c;C公司收到Volvo的EDI对接邀请&#xff0c;需要实现EDI对接。C公司将会面临哪些挑战&#xff1f;又应该相应地选择何种EDI解决方案呢&#xff1f; 汽车行业强调供需双方的高效协同&#xff08;比如研发设计、生产计划、物流信息等…

AI视频教程下载:生成式AI—从入门到精通

生成式人工智能正在彻底改变我们的生活。 本视频教程让您全面了解生成式人工智能的基本概念、模型、工具和应用&#xff0c;使您能够利用生成式人工智能的潜力&#xff0c;改善工作场所、事业和生活。 该视频教程由五门自定进度的短期课程组成&#xff0c;每门课程需要 3-5 个…

(求一个整数各位数的和)编写程序,读取一个在0和1000之间的整数,并将该整数的各位数字相加。例如:整数是 932,各位数字之和为14。

(求一个整数各位数的和)编写程序&#xff0c;读取一个在0和1000之间的整数&#xff0c;并将该整数 的各位数字相加。例如:整数是 932&#xff0c;各位数字之和为14。 提示:利用操作符%分解数字,然后使用操作符/去掉分解出来的数字。例如: 932%10-2 932/10-93。下面是一个运行示…

Windows 更新根文件夹的修改时间

简介&#xff1a; Win10 系统不会根据深层目录文件更新主目录的修改时间. 一般解决办法是关闭 Winodws 搜索引擎。 win10文件夹不能自动更新了怎么办&#xff1f;_百度知道 本脚本通过递归遍历子目录和子文件&#xff0c;来更新根目录的时间。 使用内层目录和当前目录下的最新…

[Algorithm][动态规划][01背包问题][模板 背包][分割等和子集]详细讲解 +何为背包问题?

目录 0.何为背包问题&#xff1f;1.模板 背包1.题目链接2.算法原理详解3.代码实现 2.分割等和子集1.题目链接2.算法原理详解3.代码实现 0.何为背包问题&#xff1f; 背包问题&#xff1a;有限制条件下的"组合问题" 你有一个背包&#xff0c;地上有一堆物品&#xff…

递归(全排列andN皇后)

全排列 分治与递归 递归是实现分治的一种方法 思想思路 题目&#xff1a; 全排列i 我这样直接输出会多输出一个空行&#xff08;最后一个\n&#xff09; #include<stdio.h>using namespace std; const int maxn10; int an[maxn]; int n; bool hash[maxn]{0}; int c0…

IP SSL使用率增长有利于网络安全防护!

目录 IP的特殊性 IP证书的作用原理&#xff1a; 申请IP证书的基本条件&#xff1a; 申请IP SSL证书&#xff1a; 对于SSL证书来说&#xff0c;很多朋友应该并不陌生&#xff0c;目前SSL证书广泛应用在域名服务器上&#xff0c;所以大家最熟悉的证书类型可能就是单域名SSL证…

MeiliSearch-轻量级且美丽的搜索引擎

MeiliSearch-轻量级且美丽的搜索引擎 MeiliSearch 是一个功能强大、快速、开源、易于使用和部署的搜索引擎。它具有以下特点&#xff1a; 支持中文搜索&#xff1a;MeiliSearch 对中文有良好的支持&#xff0c;不需要额外的配置。高度可定制&#xff1a;搜索和索引都可以高度…

UE4获取动画序列资产的动画时长

谢谢”朝闻道“大佬的指点~

数据脱敏技术方案选择(word)

1 概述 1.1 数据脱敏定义 1.2 数据脱敏原则 1.2.1基本原则 1.2.2技术原则 1.2.3管理原则 1.3 数据脱敏常用方法 3.1.1泛化技术 3.1.2抑制技术 3.1.3扰乱技术 3.1.4有损技术 1.4 数据脱敏全生命周期 2 制定数据脱敏规程 3 发现敏感数据 4 定义脱敏规则 5 执…

SpringCache和SpringTask

SpringCache 在启动类上加EnableCaching注解 我们只要在Controller上写一个SpringCache相应的注解 我们就能实现缓存了 简化缓存操作代码&#xff0c;提高我们的效率 我们默认是我们的spring做缓存 但我们还可以替换我们的缓存技术 例如 EhCache Google Redis 来作为…

three.js指南

threejs 相关资料 threejs 官网threejs 案例 安装&#xff08;Installation&#xff09; 使用 NPM 和构建工具进行安装 对于大多数用户而已&#xff0c;从 npm 包注册表中心 安装并使用 构建工具 会是一个更推荐的方案。因为项目需要的依赖越多&#xff0c;就越有可能遇到静…

1.vue2.x-初识及环境搭建

目录 1.下载nodejs v16.x 2.设置淘宝镜像源 3.安装脚手架 4.创建一个项目 5.项目修改 代码地址&#xff1a;source-code: 源码笔记 1.下载nodejs v16.x 下载地址&#xff1a;Node.js — Download Node.js 2.设置淘宝镜像源 npm config set registry https://registry.…

【PyTorch】PyTorch深度学习框架实战(二):torchrun

一、引言 PyTorch由facebook人工智能研究院研发&#xff0c;2017年1月被提出&#xff0c;是一个开源的Python机器学习库&#xff0c;基于Torch&#xff0c;用于自然语言处理等应用程序。PyTorch既可以看作加入了GPU支持的numpy&#xff0c;同时也可以看成一个拥有自动求导功能的…

【iOS】MRC下的单例模式批量创建单例

单例模式的介绍和ARC下的单例请见这篇&#xff1a;【iOS】单例模式 目录 关闭ARC环境MRC下的单例ARC下的单例批量创建单例Demo 关闭ARC环境 首先关闭ARC环境&#xff0c;即打开MRC&#xff1a; 或是指定某特定目标文件为非ARC环境&#xff1a; 双击某个类文件&#xff0c;指定…

python的最小二乘法(OLS)函数

1、作用 pandas提供了一些很方便的功能&#xff0c;比如最小二乘法(OLS)&#xff0c;可以用来计算回归方程式的各个参数。 2、Python导出的OLS模型的结果 下面是如何解读Python导出的OLS模型的结果。 1. 回归系数&#xff1a; 代表每个自变量对因变量的影响程度&#xff0c…

软件质量保障与测试 Lab2

Lab2 12修改代码执行结果问题解决 3修改代码执行结果问题解决 1 klee 对 symbolic.c 生成文件的执行结果&#xff1a; 2 修改代码 头文件引用添加&#xff1a; #include <klee/klee.h>执行部分&#xff1a; 将原先的读入&#xff1a; int main() {maze[y][x] X;re…

Wakeup Source框架设计与实现

Wakeup Source 为系统组件提供了投票机制&#xff0c;以便低功耗子系统判断当前是否可以进入休眠。 Wakeup Source(后简称&#xff1a;WS) 模块可与内核中的其他模块或者上层服务交互&#xff0c;并最终体现在对睡眠锁的控制上。 1. 模块功能说明 WS的处理逻辑基本上是围绕 com…

Python初步使用教程

1.基本输出print函数 a10 b20 print(a)#输出结束后会自动换行 print(b) print(a,b,猪猪侠)#print中sep决定三者之间会存在空格#连接方法一 print(猪猪,end) print(侠) #连接方法二&#xff08;只能是字符串和字符串连&#xff09; print(超级无敌)print(chr(67)) print(ord(猪…