中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

成都哪家公司做網(wǎng)站最好建立一個(gè)網(wǎng)站的費(fèi)用

成都哪家公司做網(wǎng)站最好,建立一個(gè)網(wǎng)站的費(fèi)用,嘉興響應(yīng)式網(wǎng)站,北京網(wǎng)站建設(shè)價(jià)格低一.序列化和反序列化 在Python中,序列化(Serialization)和反序列化(Deserialization)是處理對(duì)象數(shù)據(jù)的過程,主要用于對(duì)象的存儲(chǔ)或網(wǎng)絡(luò)傳輸。 序列化(Serialization) 序列化是將Pyth…

一.序列化和反序列化

????????在Python中,序列化(Serialization)和反序列化(Deserialization)是處理對(duì)象數(shù)據(jù)的過程,主要用于對(duì)象的存儲(chǔ)或網(wǎng)絡(luò)傳輸。

序列化(Serialization)

????????序列化是將Python對(duì)象轉(zhuǎn)換成一個(gè)字節(jié)流(或稱為序列化后的表示)的過程,這個(gè)字節(jié)流可以被寫入磁盤文件或通過網(wǎng)絡(luò)發(fā)送。序列化使得對(duì)象的狀態(tài)信息能夠被保存,之后可以在需要的時(shí)候恢復(fù)對(duì)象。pickle.dump(obj, file, [,protocol]) 函數(shù)就是執(zhí)行序列化的操作,各參數(shù)意義如下:

  • obj:要被序列化的Python對(duì)象。
  • file:文件對(duì)象,表示序列化后的數(shù)據(jù)將被寫入的文件或類文件對(duì)象(如BytesIO)。
  • protocol(可選):指定序列化使用的協(xié)議版本,默認(rèn)值是 pickle.HIGHEST_PROTOCOL,不同的協(xié)議影響了生成的字節(jié)流的兼容性和效率。

反序列化(Deserialization)

反序列化則是將之前序列化得到的字節(jié)流恢復(fù)成原來的Python對(duì)象的過程。這使得從磁盤文件讀取或網(wǎng)絡(luò)接收的數(shù)據(jù)能再次成為可操作的對(duì)象。對(duì)應(yīng)的,pickle.load(file) 函數(shù)用于執(zhí)行反序列化,參數(shù)意義如下:

  • file:文件對(duì)象,從該文件中讀取之前序列化的數(shù)據(jù)并恢復(fù)成Python對(duì)象。

例子:

????????假設(shè)我們有一個(gè)簡(jiǎn)單的Python對(duì)象,我們可以通過以下步驟進(jìn)行序列化和反序列化:

序列化示例

import pickledata = {'name': 'Alice', 'age': 30}
with open('example.pickle', 'wb') as handle:pickle.dump(data, handle, protocol=pickle.HIGHEST_PROTOCOL)

反序列化示例

import picklewith open('example.pickle', 'rb') as handle:data_loaded = pickle.load(handle)
print(data_loaded)  # 輸出: {'name': 'Alice', 'age': 30}

????????通過序列化和反序列化,我們可以輕松地存儲(chǔ)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)或在網(wǎng)絡(luò)間傳遞這些數(shù)據(jù),這對(duì)于長(zhǎng)期存儲(chǔ)、數(shù)據(jù)交換或分布式計(jì)算等場(chǎng)景非常有用。但需要注意的是,pickle模塊不是安全的,不應(yīng)該用來序列化不可信的數(shù)據(jù),因?yàn)樗梢詧?zhí)行任意代碼。

pickle序列化實(shí)例

下面是使用 pickle 進(jìn)行序列化和反序列化的兩個(gè)簡(jiǎn)單示例。

示例 1: 序列化與反序列化一個(gè)簡(jiǎn)單列表

序列化過程:

import pickle# 需要被序列化的簡(jiǎn)單Python對(duì)象 - 一個(gè)列表
my_list = [1, 'apple', 3.14]# 打開一個(gè)文件用于寫入序列化后的數(shù)據(jù)
with open('example_pickle_list.pkl', 'wb') as handle:# 使用pickle的dumps或dump方法進(jìn)行序列化# dump直接寫入文件句柄,dumps則返回一個(gè)bytes對(duì)象pickle.dump(my_list, handle, protocol=pickle.HIGHEST_PROTOCOL)

在此過程中,my_list 這個(gè)包含整數(shù)、字符串和浮點(diǎn)數(shù)的列表被轉(zhuǎn)換成一個(gè)字節(jié)流,并存儲(chǔ)到 example_pickle_list.pkl 文件中。

反序列化過程:

import pickle# 打開之前存儲(chǔ)的文件以讀取并反序列化數(shù)據(jù)
with open('example_pickle_list.pkl', 'rb') as handle:# 使用pickle的loads或load方法進(jìn)行反序列化# load直接從文件句柄讀取并還原對(duì)象,loads則從bytes對(duì)象還原loaded_list = pickle.load(handle)print(loaded_list)  # 輸出: [1, 'apple', 3.14]

通過 pickle.load(),我們能夠從二進(jìn)制文件中恢復(fù)出原始的 Python 列表對(duì)象。

示例 2: 序列化與反序列化自定義類的對(duì)象

假設(shè)有一個(gè)簡(jiǎn)單的自定義類 Person

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return f"Person(name='{self.name}', age={self.age})"

序列化過程:

import pickle# 創(chuàng)建一個(gè)Person對(duì)象
person_instance = Person("Alice", 30)# 序列化Person對(duì)象到文件
with open('example_pickle_person.pkl', 'wb') as person_file:pickle.dump(person_instance, person_file, protocol=pickle.HIGHEST_PROTOCOL)

反序列化過程:

import pickle# 反序列化解回Person對(duì)象
with open('example_pickle_person.pkl', 'rb') as person_file:loaded_person = pickle.load(person_file)print(loaded_person)  # 輸出: Person(name='Alice', age=30)

在這個(gè)例子中,即使 Person 類是一個(gè)自定義類,pickle 也能夠成功地序列化其實(shí)例,并在之后正確地反序列化回原始對(duì)象狀態(tài)。

序列化之后的數(shù)據(jù)形式

????????使用 pickle 序列化數(shù)據(jù)后,原始的 Python 對(duì)象會(huì)被轉(zhuǎn)換成一個(gè)二進(jìn)制格式的字節(jié)流。這個(gè)字節(jié)流包含了對(duì)象的類型信息、屬性及其值,以及可能的引用信息,以便能夠完全重建原始對(duì)象。由于它是二進(jìn)制格式,直接查看時(shí)不會(huì)像文本格式那樣直觀易讀。

如果你嘗試打印出 pickle.dumps() 方法處理后的結(jié)果,你會(huì)看到類似下面這樣的輸出,顯示為字節(jié)序列:

b'\x80\x04\x95\x16\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x06Person\x94\x93\x94)\x81\x94}\x94(\x8c\x04name\x94\x8c\x05Alice\x94\x8c\x03age\x94K\x1eub.'

????????這段二進(jìn)制數(shù)據(jù)中包含了Python解釋器如何重建對(duì)象的指令。每個(gè)字節(jié)或字節(jié)序列代表了特定的含義,比如對(duì)象類型、字符串長(zhǎng)度、整數(shù)值等。例如,\x80\x04 是 pickle 協(xié)議版本的標(biāo)識(shí),\x95\x16 可能指示全局名稱查找,\x8c 引入了一個(gè)字符串,后面跟著字符串長(zhǎng)度和內(nèi)容,\x94 表示結(jié)束,\x93 開始構(gòu)建一個(gè)新對(duì)象,等等。

????????由于這些信息對(duì)人類來說難以直接解讀,通常我們不會(huì)直接查看或編輯這些序列化后的數(shù)據(jù),而是依賴 pickle.load()pickle.loads() 來自動(dòng)解析這些字節(jié)流,恢復(fù)成原始的 Python 對(duì)象。

二.序列化的實(shí)現(xiàn)原理

????????Python中的pickle模塊實(shí)現(xiàn)序列化和反序列化的原理主要是通過對(duì)象的遞歸分析及構(gòu)造。以下是其工作流程的基本概述:

序列化過程(dump)

  1. 檢查對(duì)象類型:當(dāng)pickle.dump()被調(diào)用時(shí),pickle首先檢查要序列化的對(duì)象類型。Python的基本數(shù)據(jù)類型(如整數(shù)、浮點(diǎn)數(shù)、字符串等)有預(yù)定義的序列化方式。對(duì)于復(fù)雜類型(如列表、字典、自定義類的實(shí)例等),則需要更復(fù)雜的處理。

  2. 遞歸處理:對(duì)于復(fù)雜對(duì)象,pickle會(huì)遞歸地進(jìn)入對(duì)象的每個(gè)元素,對(duì)它們進(jìn)行同樣的檢查和序列化過程。這意味著如果一個(gè)對(duì)象包含其他對(duì)象,這些內(nèi)部對(duì)象也會(huì)被序列化。

  3. 生成二進(jìn)制流:對(duì)于每種類型,pickle使用一種特定的編碼方案將其轉(zhuǎn)換為一系列的字節(jié)。這個(gè)過程包括類型標(biāo)識(shí)符、對(duì)象的屬性或元素值等信息。例如,一個(gè)字典會(huì)被編碼為它的鍵值對(duì)序列,每個(gè)鍵值對(duì)又進(jìn)一步被序列化。

  4. 寫入文件或字節(jié)流:最終的字節(jié)流按照指定的協(xié)議格式編碼后,被寫入到文件或其他輸出流中。協(xié)議決定了如何編碼類型信息和數(shù)據(jù),不同的協(xié)議版本提供了向前或向后的兼容性。

反序列化過程(load)

  1. 讀取二進(jìn)制流:當(dāng)使用pickle.load()從文件或字節(jié)流讀取時(shí),首先讀取并解析字節(jié)流中的類型標(biāo)識(shí)符和數(shù)據(jù)。

  2. 重建對(duì)象:根據(jù)解析出的類型標(biāo)識(shí)符,pickle會(huì)創(chuàng)建相應(yīng)的Python對(duì)象,并根據(jù)字節(jié)流中的數(shù)據(jù)填充對(duì)象的屬性或內(nèi)容。對(duì)于復(fù)雜對(duì)象,這一過程也是遞歸進(jìn)行的,先創(chuàng)建容器對(duì)象,然后在其內(nèi)部重建子對(duì)象。

  3. 處理引用:在序列化復(fù)雜數(shù)據(jù)結(jié)構(gòu)時(shí),如果對(duì)象之間存在循環(huán)引用或重復(fù)引用,pickle會(huì)通過引用計(jì)數(shù)或ID映射來處理這些情況,確保反序列化后的對(duì)象結(jié)構(gòu)與原始結(jié)構(gòu)一致。

  4. 返回對(duì)象:一旦所有對(duì)象都被正確重建,pickle.load()會(huì)返回最頂層的對(duì)象,即原始數(shù)據(jù)的完全復(fù)制品。

安全性考慮

????????雖然pickle功能強(qiáng)大,但由于它能夠執(zhí)行任意的Python代碼(特別是在處理自定義類和其他可執(zhí)行代碼時(shí)),因此使用非可信來源的數(shù)據(jù)進(jìn)行反序列化可能存在安全風(fēng)險(xiǎn)。因此,在處理外部輸入的數(shù)據(jù)時(shí),推薦使用更安全的序列化庫(kù),如jsonyaml,或者確保有適當(dāng)?shù)陌踩胧﹣眚?yàn)證和清理數(shù)據(jù)。

三.為什么需要用到序列化

序列化在軟件開發(fā)和系統(tǒng)設(shè)計(jì)中扮演著重要角色,主要有以下幾個(gè)原因:

  1. 數(shù)據(jù)持久化:當(dāng)程序運(yùn)行時(shí),內(nèi)存中的數(shù)據(jù)是暫時(shí)的,程序關(guān)閉后數(shù)據(jù)就會(huì)丟失。序列化允許我們將這些數(shù)據(jù)轉(zhuǎn)換為可以存儲(chǔ)在磁盤上的格式,如文件,從而實(shí)現(xiàn)數(shù)據(jù)的持久保存。這樣,即使程序重啟或系統(tǒng)關(guān)閉,之前的狀態(tài)和數(shù)據(jù)仍然可以恢復(fù)。

  2. 跨平臺(tái)/進(jìn)程通信:在分布式系統(tǒng)或多個(gè)程序之間交換數(shù)據(jù)時(shí),序列化是必需的。通過將對(duì)象轉(zhuǎn)換為通用的格式(如JSON、XML或二進(jìn)制流),可以在不同語(yǔ)言編寫的系統(tǒng)之間輕松共享數(shù)據(jù),因?yàn)檫@些格式是跨平臺(tái)理解的。

  3. 網(wǎng)絡(luò)傳輸:在進(jìn)行網(wǎng)絡(luò)通信時(shí),如通過HTTP請(qǐng)求或RPC(遠(yuǎn)程過程調(diào)用),數(shù)據(jù)需要被序列化成適合網(wǎng)絡(luò)傳輸?shù)母袷?。這不僅包括基本類型,還包括復(fù)雜對(duì)象結(jié)構(gòu),確保接收方能夠準(zhǔn)確無誤地重建發(fā)送方的意圖。

  4. 緩存和復(fù)制:序列化有助于實(shí)現(xiàn)數(shù)據(jù)緩存,比如將計(jì)算結(jié)果序列化后存儲(chǔ),以便下次直接使用而無需重新計(jì)算。同時(shí),在分布式系統(tǒng)中,對(duì)象的序列化可以用來輔助數(shù)據(jù)復(fù)制,確保數(shù)據(jù)的一致性。

  5. 可移植性和兼容性:序列化使得應(yīng)用程序狀態(tài)或配置可以輕松地在不同環(huán)境之間遷移,無論是不同版本的同一程序,還是完全不同系統(tǒng)之間的數(shù)據(jù)交換,都提高了軟件的靈活性和可維護(hù)性。

  6. 批處理和任務(wù)隊(duì)列:在需要將任務(wù)分解并通過消息隊(duì)列分發(fā)時(shí),任務(wù)及其所需的數(shù)據(jù)常常需要被序列化,以便在隊(duì)列中存儲(chǔ)和傳輸,然后在另一個(gè)進(jìn)程中反序列化并處理。

????????綜上所述,序列化是現(xiàn)代軟件開發(fā)中不可或缺的技術(shù),它簡(jiǎn)化了數(shù)據(jù)存儲(chǔ)、傳輸和交換的復(fù)雜性,增強(qiáng)了系統(tǒng)的靈活性和可靠性。

http://www.risenshineclean.com/news/1399.html

相關(guān)文章:

  • 建網(wǎng)站注冊(cè)培訓(xùn)心得體會(huì)2000字
  • 網(wǎng)站建設(shè)的經(jīng)濟(jì)可行性怎樣做網(wǎng)站賣自己的產(chǎn)品
  • 網(wǎng)站備案信息真實(shí)性核驗(yàn)網(wǎng)頁(yè)版百度云
  • 黃渡網(wǎng)站建設(shè)百度網(wǎng)盤網(wǎng)頁(yè)版登錄
  • 電子商務(wù)網(wǎng)站建設(shè)選擇服務(wù)器要考慮的因素有 seo won
  • 鄒城手機(jī)網(wǎng)站建設(shè)網(wǎng)絡(luò)營(yíng)銷軟件條件
  • dw做單頁(yè)網(wǎng)站教程seo排名點(diǎn)擊軟件運(yùn)營(yíng)
  • 蘇州做網(wǎng)站的公司哪家好衡陽(yáng)百度推廣
  • 企業(yè)開展網(wǎng)站建設(shè)廣告聯(lián)盟有哪些
  • ps如何做ppt模板下載網(wǎng)站谷歌三件套
  • 這是我自己做的網(wǎng)站嗎現(xiàn)在推廣平臺(tái)哪家最好
  • 望城區(qū)政府門戶網(wǎng)站城市建設(shè)短視頻營(yíng)銷的發(fā)展趨勢(shì)
  • 怎樣設(shè)計(jì)一個(gè)網(wǎng)頁(yè)頁(yè)面關(guān)鍵詞優(yōu)化搜索引擎
  • 外貿(mào)網(wǎng)站做的作用是什么sem工作內(nèi)容
  • 網(wǎng)上哪里可以免費(fèi)學(xué)編程百度搜索關(guān)鍵詞排名優(yōu)化技術(shù)
  • 煙臺(tái)網(wǎng)站建設(shè) 制作 推廣百度一下1688
  • 怎么建設(shè)網(wǎng)站模板上傳站長(zhǎng)交流平臺(tái)
  • 軟件推廣網(wǎng)站周口seo
  • 新建的wordpress沒有注冊(cè)站外seo是什么
  • wordpress產(chǎn)品傭金杭州百度整站優(yōu)化服務(wù)
  • h5 做的網(wǎng)站 價(jià)格怎么樣在百度上免費(fèi)推廣
  • 北京網(wǎng)站制作官網(wǎng)分銷渠道
  • 網(wǎng)站怎么做移動(dòng)端適配今天最新消息
  • tv做后綴的動(dòng)漫網(wǎng)站百度廣告點(diǎn)擊軟件
  • 河南省住房和城鄉(xiāng)建設(shè)廳網(wǎng)站主頁(yè)鄭州最好的建站公司
  • 宣城市政建設(shè)集團(tuán)有限公司網(wǎng)站鄭州seo外包平臺(tái)
  • 銷售網(wǎng)站建設(shè)公司網(wǎng)絡(luò)營(yíng)銷是以什么為基礎(chǔ)
  • 做的最成功的網(wǎng)站百度知道官網(wǎng)登錄入口
  • 網(wǎng)站宣傳方法有哪些營(yíng)銷方法有哪些方式
  • 北京html5網(wǎng)站建設(shè)百度在線問答