日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

串行化的机制和原理

發(fā)布時間:2025/4/16 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 串行化的机制和原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天終于把Seralization 的基本框架搭好了,簡單的測試了一下,存儲沒問題,讀取好像還有點問題.由于現(xiàn)在還沒有寫由Object派生出來的類,測試不出什么東西,等把場景管理的部分完成后再回來改.

?

由于整個Seralization的機制比較煩瑣,我今天把整個思路整理一下,一是作為交流,另外也作為CoagelEngine的開發(fā)文檔.

?

Seralization 又叫串行化,簡單的講,就是一種保存當前運行程序的狀態(tài),下次運行程序時可以將被保存的狀態(tài)提取出來,這樣就可以從上次保存的狀態(tài)開始往后運行.在游戲設計中,這也就是所謂的存檔/讀檔功能.

?

那么Seralization如何才能實現(xiàn)呢. 在結構化的程序設計中,函數(shù)(方法)和數(shù)據(jù)是相互獨立的.

我們需要將當前內(nèi)存塊中的每個變量數(shù)據(jù)都保存到文件(后者是一個內(nèi)存塊,這點在下文提到),然后下次運行時在將這些數(shù)據(jù)都提取出來,付給每個變量. 比如說我的程序有兩個全局變量Ea,Eb.有兩個局部變量a,b. 其中a,b都是函數(shù)Fun 的局部變量.那么我需要保存這4個變量的值. 并且我要知道a,bFun的局部變量,Ea,Eb是全局變量. 并且我需要知道程序執(zhí)行到哪一步了. 這是個復雜且難以完成的工作. 因此Seralization 都是在OOP 面向對象的原則下進行的. 甚至有的人直接稱其為類的串行化.

?

基于OOP原則的程序, 類是數(shù)據(jù)和方法的集合. 我們只需要保存當前生存著的每個類中的數(shù)據(jù), 類與類之間的關系, 當然如果有全局變量也需要保存. 下次還原時我們還原被保存的這些信息, 就還原了程序的狀態(tài).

?

這里就引入了幾個問題.

1. 我們知道類繼承機制中的虛函數(shù)機制可以動態(tài)的決定調(diào)用哪個函數(shù). 比如:

Class A

{

Public:

??? Visual void fun() { return 1;};

}

?

Class B : public A

{

? Public:

??? Virtual void fun(){ return 2;};

}

?

我定義一個指針 A* p = new B;

注意這里雖然p是一個A* 類的指針,但他實際上指向的是一個class B.

因此調(diào)用p->func 其實調(diào)用的是 B::func();

?

回到剛才的話題.類的成員函數(shù)如果被聲明是虛函數(shù)的話,可以動態(tài)的決定調(diào)用哪個類的函數(shù).但是類的創(chuàng)建必須要寫成 A p = new A, 這里我們不能利用虛函數(shù)來實現(xiàn)動態(tài)的決定創(chuàng)建的是什么類.因為創(chuàng)建時程序還不知道p到底值向什么類.創(chuàng)建A類就必須寫成new A,創(chuàng)建B類就必須寫成new B. 這就是問題所在了.這個問題又被分為兩個方面.首先,我們必須在保存類的信息時同時保存該類的類型

(是class A,還是 class B.這點可以利用RTTI的機制來實現(xiàn).RTTI的原理很簡單,我們在每個類中都添加一個字符串,這個字符串記錄的這個類的類型名字.比如class A的字符串就是”A”,class B的字符串就是”B”.當我們保存的時候,我們把這個字符串也保存起來.這樣當我們讀取的時候就知道現(xiàn)在讀取的數(shù)據(jù)是屬于什么類的了.

?

然后我們需要解決的問題就是如果創(chuàng)建這個類了.前面說了.我們不能利用new 來創(chuàng)建,因為這里的創(chuàng)建是程序執(zhí)行時動態(tài)決定的.我們事先不知道哪些類需要創(chuàng)建.這個問題我們利用object factory的思想來解決.我們?yōu)槊糠N類都定義一個static factoryFunc();由于是static

的,所以該類的所以實例都共享這個方法,同時這個factoryFunc()是類相關的,不是實例相關的,因此在類還沒被實例化之前就存在了(可以想像成全局的,從程序運行開始一直存在到程序結束). 我們將每個類的factoryFunc和該類的類型名(A,B)一起添加到一個map

容器中,一個類型名對應一個factoryFunc. factoryFunc封裝了類的new 操作.這樣我讀取存檔的時候.我只需要先讀取類的類型名,然后到map里去查找這個類型名對應的factoryFunc,然后調(diào)用它來創(chuàng)建這個類就行了.偽代碼如下

?

Read(stream, classname);

factoryFunc = Map->find(classname)

object* p = factoryFunc();

?

這樣就實現(xiàn)了類的動態(tài)創(chuàng)建.

?

2.如何保存類之間的關系

這里我說類之間的關系就是指類的指針成員指向的其它類.由于我設計的引擎是以OOP為基礎的.我定義了一個Object 類,并且認為其它一切的類都是這個類的派生類.注意最開始我們提到的保存機制保存了類的指針.但是如果我們新創(chuàng)建了一個類,那這個類的指針是系統(tǒng)自動分配的,和上次保存的地址是不一樣的.因此不能簡單的將當前類的指針成員的值保存下來,然后在讀取出來重新付給它(因為現(xiàn)在這個值代表的內(nèi)存塊里的數(shù)據(jù)和上次不一樣了).我們需要一個映射機制,能將舊的指針值和新的指針值對應起來.我這里也是利用的map來實現(xiàn).

?

?

整個Seralization機制流程如下:

?

主要是2個類.Object , Stream

其中Stream里面有一個vector<object*> top,用來保存場景中的主要物體.這里需要解釋一下.我的設計思路是場景中的物體是有關聯(lián)關系的.比如一輛汽車,它有4個子物體――輪子.如果這輛汽車沒有父節(jié)點,那汽車就是一個主要物體.而輪子不是主要物體.這個容器的作用是用來遞歸的調(diào)用Object的方法.

Stream的第2個容器是static map<string,factortFunc*> factory, 就是上面提到的,將factoryFunc和類的類型名對應起來.

Stream的第3個容器是map<Object*,Link*> ?mLink ,Link是一個自定義的類,它有一個object*

,用來表示它是哪個實例的Link,還有一個vector<object*>,里面保存這個實例的指針成員數(shù)據(jù).

?

Stream的第4個容器是vector<Object*> order,用來保存場景中所有的實例指針.

?

Stream提供SaveLoad兩個方法.

?

Save: 首先將order清空,然后對top中的每個實例都調(diào)用object::register.這個方法是將該實例的指針添加到order中,并遞歸的調(diào)用這個實例的子實例.這樣order就保存了所有實例的指針值了.

   然后對每個實例都調(diào)用Object::Save 當然,這里Save 和 register都是虛函數(shù).

Save的作用是將類的類型名,類的指針,類的名字,類的數(shù)據(jù)成員,類的成員指針都保存起來.如果這個實例是主物體,那就在類的類型名前加一個”Top”.

?

?

?

Load: 首先將order, mLink清空,依次讀出每一塊數(shù)據(jù),根據(jù)數(shù)據(jù)中類的類型名,去factory中找到對應的方法,創(chuàng)建這個類,然后把類的名字,類的數(shù)據(jù)成員都從數(shù)據(jù)塊中讀出付給新的類.接下來是重點了,創(chuàng)建這個類(實例)以后,要把它跟一個Link類聯(lián)系起來.把這個實例現(xiàn)在的指針付個LinkObject*,并且將數(shù)據(jù)塊中的關于成員指針的數(shù)據(jù)都加入到Linkverctor中.注意這里vector中還是舊的指針數(shù)據(jù)哦.最后讀出數(shù)據(jù)塊中這個類的指針值,將它作為關于這個類的標示,和Link一起放入mLink中.于是mLink就成了用舊指針值作索引,用保存了這個實例的新指針值和這個實例的就指針成員的Link作值的hash表.

上面的步驟結束后.我們從頭查找m_link,對每一個LinkObject* ,我們都調(diào)用虛函數(shù)

Object::Link(),并把該Link作為參數(shù)傳給Link()Object::Link會根據(jù)Linkvector里面的每個值作索引,去m_link里面找到他對應的Link,并把Linkobject* 傳回來,作為該Object新的成員指針.

?

大體的流程就是這樣,過幾天有空我會畫一張詳細的流程圖

?

轉載于:https://www.cnblogs.com/badkeeper/articles/123723.html

總結

以上是生活随笔為你收集整理的串行化的机制和原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本伦理一区 | 欧美高清在线一区 | 女警白嫩翘臀呻吟迎合 | 国产一卡二卡 | 成人欧美一区二区三区小说 | 国内偷拍一区二区 | 精品九九九 | h片免费在线观看 | 污网站在线播放 | 97久久人人超碰caoprom欧美 | 狠狠躁天天躁夜夜躁婷婷 | 国产精品jizz在线观看老狼 | 亚洲成年网站 | 亚洲热在线| 日韩黄色免费视频 | 床上激情网站 | 啪啪福利视频 | 欧美变态口味重另类 | 一区二区三区在线看 | 亚洲第9页| 国产老妇视频 | 一级片在线免费 | 国产精品成人一区二区网站软件 | 校园春色亚洲激情 | 日韩电影在线观看中文字幕 | 久久一区二区三区精品 | 五月天国产 | 黑帮大佬和我的三百六十五天 | av在线免费观看不卡 | 26uuu国产精品视频 | 欧美日韩一区二区三区四区五区 | 少妇综合| 国产精品国产一区二区 | 幸福宝在线观看 | 国产宾馆实践打屁股91 | 日韩免费观看 | 米奇色| 国产一区二区高清视频 | 亚洲欧美日韩精品色xxx | 国产啊v在线观看 | 18av视频 | 亚洲精品无码久久久 | 一本久久精品一区二区 | 黄在线免费 | 在线观看亚洲色图 | 嫩草在线看| 亚洲精品久久久久久国产精华液 | 精品黑人一区二区三区在线观看 | 久久精品视频1 | 不卡的av在线播放 | 亚洲热av | 亚洲最大看欧美片网站 | 国产日| 亚洲品质自拍视频 | 久久久久久久久精 | 亚洲天堂一区二区三区四区 | 色日韩 | 久久久综合精品 | 在线观看午夜视频 | 日韩女优中文字幕 | 91精品国产自产在线观看 | 日本在线黄色 | 日韩欧美网 | 乌克兰黄色片 | 一级免费片 | 你懂的在线观看视频 | 亚洲涩视频 | 久久国产精品久久久 | 97爱视频 | 欧美中文字幕在线播放 | 日本激情一区二区 | 成人在线观看免费爱爱 | 中文字幕亚洲无线码在线一区 | 久久色在线 | 人妻少妇久久中文字幕 | 欧美日韩国产成人在线 | 国模吧一区二区三区 | 天天久久 | 午夜在线精品偷拍 | 黄色av网站在线看 | 四虎国产精品永久在线国在线 | 一区免费 | 欧美老肥婆性猛交视频 | 欧美午夜精品久久久久久孕妇 | 性毛片| 高潮一区二区 | 亚洲a中文字幕 | 毛片av在线观看 | 好屌妞视频这里有精品 | 男女羞羞动态图 | 欧美人妻一区二区 | 日韩在线播放一区二区 | 久久亚洲婷婷 | 91制服诱惑| 日韩二区三区四区 | 黄网www| 免费一级做a爰片久久毛片潮 | 小柔好湿好紧太爽了国产网址 | 日韩av一区二区三区在线观看 |