首页 > 编程语言 >UE4.27, 揣摩源码, 序列化 (三) FLinkerLoad, FLinkerSave

UE4.27, 揣摩源码, 序列化 (三) FLinkerLoad, FLinkerSave

时间:2024-12-29 21:19:45浏览次数:8  
标签:UObject UE4.27 FLinkerSave UPackage FLinkerLoad 源码 FLinker 序列化

3.  FLinkerLoad, FLinkerSave分别是UObject的反序列化和序列化的内核

  3.0. UPackage与UObject

    UObject因为涉及与其他UObject的复杂引用关系,如果我们客制化地单独正反序列化每一个UObject,我们会在反序列化的时候惊觉这是繁琐而不可能的。

    为了满足UObject这种复杂的对象的序列化,UE选择将UObject和一大批额外信息整合为UPackage,
    以正反序列化UPackage的方式,将UObject连带着这堆信息一齐正反序列化

 

  3.1. SVO

    UObject序列化:获得与该UObject有外部链关系的UPackage后,FLinker凭借合法的UPackage创建FLinkerSave,并序列化UPackage

    UObject反序列化:获得UPackage后,FLinker凭借合法的UPackage创建FLinkerLoad,并籍此反序列化UPackage

      UObject反序列化相当复杂,SVO的说明只能引领整体思考

 

 

    实际观察的反序列化堆栈后,我们会发现:

    LoadObject()->StaticLoadObject()

    LoadClass()->StaticLoadObject()

    ->StaticLoadObject()->StaticLoadObjectInternal  ->ResolveName

                           -尝试使用传入的字符串来获得upackage,并处理出ObjectName-

                           [ResolveName成功,获得upackage]->StaitcFindObjectFast

                                             ->StaticFindObjectFastInternal

                                             -全局UObject哈希表查找-

                           [ResolveName失败]->[字符串可疑(没有‘.’) ]-> -修补字符串- ->StaticFindObjectFastInternal
                                                      -全局UObject哈希表查找-

 

  3.2. 关键继承关系

    FLinkerLoad, FLinkerSave
      class FLinkerLoad : public FLinker, public FArchiveUObject

      class FLinkerSave : public FLinker, public FArchiveUObject

        class FLinker : public FLinkerTables

 

    FArchiveUObject

      class FArchiveUObject : public FArchive

        class FArchive : private FArchiveState

  3.3. 类层级与基本功能说明
    3.3.1. FArchiveUObject

      其中四个静态函数和<<运算符重载,本质上负责了序列化FLazyObjectPtr, FSoftObjectPtr, FSoftObjectPath, FWeakObjectPtr四个特殊的UObjectPtr类型

      其中的实现相当简单,在特殊条件下序列化对应object的guid,正常情况下序列化UObject*
    3.3.2. FLinkerTables

      还记得前文提到的UPackage的组成结构吗?Summary, Names, Imports Table, Exports Table, Depends Table, ImportGuids Map, ExportGuids Map, Thumbnails, Export-Objects

      FLinkerTables结构体里直接定义了 Names, Imports Table, Exports Table, Depends Table,显然它是反序列化时存储uobject的其他相关数据的重要结构体

    3.3.3. FLinker

      UE注释里是这样介绍FLinker的,管理与ue相关的package数据,充当磁盘内容内存中的UPackage桥梁

 

      Manages the data associated with an Unreal package. Acts as the bridge betweenthe file on disk and the UPackage object in memory for all Unreal package types.
      从这一段话可能难以注意到的信息,事实上FLinker在作用前总是需要磁盘内容和内存中的UPackage同时有效,正如桥梁不能悬空作用,它需要桥墩的两端都有效

      FLinker里定义了 Summary

    3.3.4. FLinkerLoad 

      FLinkerLoad的Tick函数将各种UPackage的除ExportObject数据从uasset中加载进来

      最后调用LoadAllObjects彻底完成反序列化
    3.3.5. FLinkerSave

      原谅我能力有限,以下内容不一定准确

      FLinkerSave在package.h的静态函数Save里的应用,比如接受该类基类archive的serialize函数是重写在各个客制化的UObject派生类里的,

      更贴近的应用,反而更多是使用linker的tell和seek作为工具类,或者使用其中的结构体来存储逻辑标识而不是实际写入的数据来作为辅助类
      真正写入二进制数据的函数是这个SavePackageUtilities::WriteToFile

    3.3.6. Thumbnails 在FLinkerManager::EnsureLoadingComplete被加载

 

  3.4. 调用堆栈

    3.4.1 UObject序列化

      UPackage::SavePackage()->

        UPackage::Save()->

          ->2711-2862 序列化CDO或者依靠子类的重写serialize函数序列化子类

          //在此处查找这个serialize的引用,很多子类,某某actor都重写了它

           -2899-3023 标记相关object,class,package的名称


             -// Build ImportMap.

          -// Build ExportMap.

 

          -...

          // Save the import map.

          // Save the export map.
          -...

          -finished


    3.4.2 UObject反序列化

      LoadObject()->

        StaticLoadObject()->

          StaticLoadObjectInternal()->

            ResolveName()//由StrName(其实是传入的路径TChar*参数)查找UPackage,找不到会创建一个

              LoadPackage()

            StaticFindObjectFast()

              StaticFindObjectFastInternal()

                StaticFindObjectFastInternalThreadSafe()

                  //使用全局UObject的哈希表查询

            //...杂七杂八的路径修补后重新尝试

 

      LoadPackage()是实际的反序列化步骤

      LoadPackage()->

        LoadPackageInternal()->

          //...//寻找package

          GetPackageLinker()->

          //寻找或者创建一个FLinkerLoad* Linker

            FLinkerLoad::CreateLinker()->

              Tick()

              //一系列反序列化在此完成

            Linker->LoadAllObjects()

            // 加载UObejcts

 

标签:UObject,UE4.27,FLinkerSave,UPackage,FLinkerLoad,源码,FLinker,序列化
From: https://www.cnblogs.com/chenxuanzuo/p/18633621

相关文章

  • SSM阿迪达斯服装销售管理系统-毕业设计源码33299
     摘要在当今数字化、快节奏的时代,高效的商业运营和精准的市场策略已成为企业成功的关键。特别是对于像阿迪达斯这样的国际知名服装品牌,面对日益激烈的市场竞争和消费者需求的多样化,拥有一套先进的销售管理系统显得尤为重要。为此,我们精心研发了SSM阿迪达斯服装销售管理......
  • springboot校园以物易物系统-毕业设计源码33451
    目 录1绪论1.1选题背景1.2研究意义1.3论文结构与章节安排2 校园以物易物系统系统分析2.1可行性分析2.2系统流程分析2.2.1 数据流程3.3.2 业务流程2.3 系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4 系统用例分析2.5本章小结3......
  • springboot毕业设计管理系统-毕业设计源码23352
    摘 要当前社会信息化进程的快速发展,高校毕业设计管理系统的设计与实现也是应对信息化需求的重要举措之一。随着互联网技术的日新月异,传统的毕业设计管理方式已无法满足快速、高效的需求,因此需要借助信息技术提供更便捷、高效的管理方案。本文介绍了一个基于springboot框......
  • SSM校园疫情管理系统-毕业设计源码25914
    摘要随着新冠疫情的全球蔓延,校园疫情管理成为了教育领域的重要议题。为了应对这一挑战,本文提出并实现了一个基于微信小程序的校园疫情管理系统。该系统旨在通过数字化手段,提高校园疫情管理的效率和安全性,保障师生的健康与安全。该系统基于微信小程序框架开发,利用其便捷性......
  • SSM河南省乡村旅游平台-毕业设计源码50498
    目 录摘要Abstract1绪论1.1研究背景1.2研究意义1.3论文结构与章节安排2 河南省乡村旅游平台分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 ......
  • springboot莆田鞋服企业交流平台-毕业设计源码50267
    摘 要随着互联网的发展和莆田鞋服产业的壮大,企业间的交流与合作变得越来越重要。为了满足莆田鞋服企业的交流需求,本文设计并实现了一个基于SpringBoot的莆田鞋服企业交流平台。该平台旨在提供一个便捷、高效的企业间交流环境,促进信息共享、业务合作和市场拓展。平台基......
  • springboot海外代购平台-毕业设计源码50852
    SpringBoot海外代购平台摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,代购平台当然也不例外。海外代购平台是以实际运用为开发背景,运用软件工程原理和开发方法,采用Java技术构建的一个管理系统。整个开发......
  • springboot智慧仓库管理系统-毕业设计源码51095
    摘 要本文详细阐述了基于SpringBoot框架的智慧仓库管理系统的设计与实现过程。该系统旨在通过集成先进的信息化技术,提升仓库管理的智能化水平,实现高效、准确的物资管理。系统核心功能包括产品仓库管理、入库记录管理、出库记录管理、借物记录管理以及归还记录管理。在产......
  • 400个计算机毕业设计项目推荐(源码+文档+视频)
    计算机毕业设计案例Java毕业设计案例ASP.NET毕业设计案例PHP毕业设计案例微信小程序毕业设计案例基于Java的农产品管理系统基于ASPNETMVC的网站式音乐播放基于PHP的图书馆座位管理系统微信小程序自习室预约管理系统–2024计算机毕业设计基于Java的城市公交查询与可视化系统......
  • flask框架考研图书资料销售系统毕设源码+论文
    校园二手货物交易平台m1a2o本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于考研图书资料销售系统的研究,现有研究主要以图书销售系统为主,但专门针对考研图书资料销售系统的研究较......