導航:首頁 > 程序命令 > 程序員的序列化

程序員的序列化

發布時間:2022-10-28 11:44:41

『壹』 為什麼要序列化

a. 一個原因是將對象的狀態保持在存儲媒體中,以便可以在以後重新創建精確的副本。
我們經常需要將對象的欄位值保存到磁碟中,並在以後檢索此數據。盡管不使用序列化也能完成這項工作,但這種方法通常很繁瑣而且容易出錯,並且在需要跟蹤對象的層次結構時,會變得越來越復雜。可以想像一下編寫包含大量對象的大型業務應用程序的情形,程序員不得不為每一個對象編寫代碼,以便將欄位和屬性保存至磁碟以及從磁碟還原這些欄位和屬性。序列化提供了輕松實現這個目標的快捷方法。

b.另一個原因是通過值將對象從一個應用程序域發送到另一個應用程序域中。
例如,序列化可用於在 ASP.NET 中保存會話狀態並將對象復制到 Windows 窗體的剪貼板中。遠程處理還可以使用序列化通過值將對象從一個應用程序域傳遞到另一個應用程序域中。
公共語言運行時 (CLR) 管理對象在內存中的分布,.NET 框架則通過使用反射提供自動的序列化機制。對象序列化後,類的名稱、程序集以及類實例的所有數據成員均被寫入存儲媒體中。對象通常用成員變數來存儲對其他實例的引用。類序列化後,序列化引擎將跟蹤所有已序列化的引用對象,以確保同一對象不被序列化多次。.NET 框架所提供的序列化體系結構可以自動正確處理對象圖表和循環引用。對對象圖表的唯一要求是,由正在進行序列化的對象所引用的所有對象都必須標記為 Serializable(請參閱基本序列化)。否則,當序列化程序試圖序列化未標記的對象時將會出現異常。
當反序列化已序列化的類時,將重新創建該類,並自動還原所有數據成員的值。

『貳』 序列化和反序列化

序列化(serialization)在計算機科學的數據處理中,是指將數據結構或對象狀態轉換成可取用格式(例如存成文件,存於緩沖,或經由網路中發送),以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。依照序列化格式重新獲取位元組的結果時,可以利用它來產生與原始對象相同語義的副本。對於許多對象,像是使用大量引用的復雜對象,這種序列化重建的過程並不容易。面向對象中的對象序列化,並不概括之前原始對象所關系的函數。這種過程也稱為對象編組(marshalling)。從一系列位元組提取數據結構的反向操作,是反序列化(也稱為解編組、deserialization、unmarshalling)。

序列化在計算機科學中通常有以下定義:

序列化與反序列化為數據交換提供了可能,但是因為傳遞的是位元組碼,可讀性差。在應用層開發過程中不易調試,為了解決這種問題,最直接的想法就是將對象的內容轉換為字元串的形式進行傳遞。具體的傳輸格式可自行定義,但自定義格式有一個很大的問題——兼容性,如果引入其他系統的模塊,就需要對數據格式進行轉換,維護其他的系統時,還要先了解一下它的序列化方式。為了統一數據傳輸的格式,出現了幾種數據交換協議,如:JSON, Protobuf,XML。這些數據交換協議可視為是應用層面的序列化/反序列化。

如前所述,序列化和反序列化的出現往往晦澀而隱蔽,與其他概念之間往往相互包容。為了更好了讓大家理解序列化和反序列化的相關概念在每種協議裡面的具體實現,我們將一個例子穿插在各種序列化協議講解中。在該例子中,我們希望將一個用戶信息在多個系統裡面進行傳遞;在應用層,如果採用 .net 語言,所面對的類對象如下所示:

JSON中的元素都是鍵值對——key:value形式,鍵值對之間以":"分隔,每個鍵需用雙引號引起來,值的類型為String時也需要雙引號。其中value的類型包括:對象,數組,值,每種類型具有不同的語法表示。

基礎類型

對象

數組

說到XML就不得不介紹下SOAP(Simple Object Access protocol),SOAP 是一種被廣泛應用的,基於 XML 為序列化和反序列化協議的結構化消息傳遞協議。SOAP 在互聯網影響如此大,以至於我們給基於 SOAP 的解決方案一個特定的名稱 --Web service。SOAP 雖然可以支持多種傳輸層協議,不過 SOAP 最常見的使用方式還是 XML+HTTP。SOAP 協議的主要介面描述語言(IDL)是 WSDL(Web Service Description Language)。SOAP 具有安全、可擴展、跨語言、跨平台並支持多種傳輸層協議。如果不考慮跨平台和跨語言的需求,XML 的在某些語言裡面具有非常簡單易用的序列化使用方法,無需 IDL 文件和第三方編譯

實際使用中具體要使用哪個協議,我們可以從上列出的幾個特性進行綜合考慮

序列化協議一方面要能擺脫語言、平台的束縛;另一方面要在業界耳熟能詳應用廣泛。比如java標準的對象序列化實現就不是這一條的好榜樣,你要一個C程序員將Java標准序列化實現的數據反序列化成對應結構體是一個很蛋疼的事情。相反,JSON就是一個很好的序列化協議,至少在這一條上算得上是佼佼者了。

序列化協議要能方便開發過程中的調試。做過二進制協議開發的同學一定深有體會,肉眼基本不可辨別序列化後的數據,需要藉助一些第三方的工具一點點分析。相對於二進制協議,文本協議就比較和藹可親了。

協議要能夠經得住時間的考驗。一般情況下採用公開流行的協議是不存在這個問題的,因為他們都被成千上萬的應用檢驗過了。特別要小心的是自定義協議,舉個反例,比如自定義一個類似於Java標准序列化協議的協議,由於當前業務沒有涉及到對象和對象之間的繼承關系,所以協議制定者沒有考慮對象繼承的情況。但是隨著業務的發展,系統中出現了繼承關系的實體類,某個同事不小心將這種對象的實例序列化,結果可想而知。協議不夠成熟,所以自定義協議需要考慮的因數很多。如果自己不是大牛,建議不要自定義序列化協議。

和穩定性差不多,滿足通用性條件的協議基本不會出現這個問題。問題還是會出現在自定義協議上。協議的成熟是一個漫長的過程,要經過不斷的測試。比如穩定性中出現的那個問題,協議將繼承關系的序列化加入,升級之後就能解決問題。但是要做到兼容以前的版本就不那麼容易了。協議的制定者也不是聖人,不可能考慮得那麼周全,但是一定要有一套可擴展的方案,這樣協議才能存活下來,慢慢迭代成穩定版本。

說道性能問題,無非就是時間和空間的博弈。序列化結果數據的大小,直接影響網路傳輸的帶寬和磁碟存儲的空間。序列化和反序列化過程所消耗的時間長短,影響系統的性能。幾種常用的協議性能的比較網上有很多,這里就不詳細介紹了。

『叄』 C++語言如何將用戶定義的類持久化求大神指點!

你查一下「串列化CArchive對象」。又稱「序列化」。一般用戶對象從CObject派生出來。
從檔案文件中讀取該對象或向檔案文件中寫入該對象。必須為希望串列化的每個類覆蓋Serialize。被覆蓋的Serialize首先必須調用基類的Serialize函數。
在類的聲明中必須使用DECLARE_SERIAL宏,並且在類的執行過程中也必須使用IMPLEMENT_SERIAL宏。
使用CArchive::IsLoading或CArchive::IsStoring函數,用於決定是否裝載或存儲了檔案文件。
通過CArchive::ReadObject和CArchive::WriteObject來調用Serialize函數。這些函數與CArchive插入操作符()相關聯。
如果要了解有關串列化的例子,請參閱聯機文檔「Visual C++程序員指南」 中的「串列化(對象永久化)」。
序列化

1. 該類需要從CObject類派生(可以是間接派生);
2. 在類中中進行DECLARE_SERIAL宏定義;
3. 類存在有預設的構造函數;
4. 類中實現了Serialize()函數,並且在其中調用基類的序列化函數;
5. 使用IMPLEMENT_SERIAL宏指明類名及版本號;
編輯本段
作用局限

序列化簡化了對象的保存和載入,為對象提供了持久性。但是,序列化本身仍具有一定的局限性。由於序列化一次從文件中載入所有對象,因此,它不適合於大文件編輯器和資料庫。對於資料庫和大文件編輯器,它們每次只是從文件中讀入一部分。此時,就不應該採用文檔的序列化機制來直接讀取和保存文件了。另外,使用外部文件格式(預先定義的文件格式而不是本應用程序定義的文件格式)的程序一般也不使用文檔的序列化。
示例

請參閱ObList::CObList,了解所有CObject示例中使用的CAge類。
// example for CObject::Serialize
void CFileSerializeDoc::Serialize(CArchive& ar){
if (ar.IsStoring()){
ar << m_sizeDoc; //m_sizeDoc信息序列化到ar
}else{
ar >> m_sizeDoc; //ar序列化到m_sizeDoc
}
m_strokeList.Serialize(ar);//序列化m_strokeList
}

『肆』 Java程序員應該掌握哪些東西

java是熱門的語言之一,TIOBE編程語排名Java排名第二,僅在C語言之後。Java可以用來開發web應用和桌面應用,更重要的是Java具有跨平台性:write once, run everywhere。

Java相對其他語言來說,更容易學習。如果你想成為一名Java程序員,根據個人經驗,認為你至少應該對下面的這些內容非常熟練,才能在Java開發上游刃有餘。

Java基礎部分:

OOP概念

抽象類與介面

構造函數與initialization order(初始化順序)

Java中的一些關鍵字:static、final、 volatile、synchronized、transient、this等等

File I/O 和 序列化

Collections:List、Map、Set

異常

泛型

JVM和內存管理

多線程和同步

設計模式

反射機制

若開發基於Web的應用,下面這些內容應該熟練掌握:

Web相關技術,比如HTML、CSS、Javascript、jQuery

JSP/Servlets

Web框架,比如SSH三大框架、myBatis

XML和JSON

Web伺服器,比如Tomcat

Web應用伺服器,WebLogic、WebSphere

一些基本庫,比如 Java mail、log4j等

Java程序員都應該掌握的資料庫技術:

SQL查詢語句:Inner Outer Joins、Group by、Having

存儲過程

觸發器

游標

資料庫驅動(JDBC)

一些工具和思想方法:

開發工具:比如Eclipse、MyEclipse、IntelliJ IDEA

版本管理工具,比如SVN、Git

測試:單元測試、jUnit

需求分析

版本管理

『伍』 程序開發中json 存儲結構化數據是怎麼回事呢

使用 json 存儲結構化數據就是從文件中讀寫字元串很容易。

1.數值就要多費點兒周折,因為 read() 方法只會返回字元串,應將其傳入 int() 這樣的函數,就可以將 '123' 這樣的字元串轉換為對應的數值 123。當你想要保存更為復雜的數據類型,例如嵌套的列表和字典,手工解析和序列化它們將變得更復雜。
好在用戶不是非得自己編寫和調試保存復雜數據類型的代碼,Python 允許你使用常用的數據交換格式 JSON(JavaScript Object Notation)。標准模塊 json 可以接受 Python 數據結構,並將它們轉換為字元串表示形式;此過程稱為 序列化。從字元串表示形式重新構建數據結構稱為 反序列化。序列化和反序列化的過程中,表示該對象的字元串可以存儲在文件或數據中,也可以通過網路連接傳送給遠程的機器。
Note
2.JSON 格式經常用於現代應用程序中進行數據交換。許多程序員都已經熟悉它了,使它成為相互協作的一個不錯的選擇。
如果你有一個對象 x,你可以用簡單的一行代碼查看其 JSON 字元串表示形式:
>>> json.mps([1, 'simple', 'list'])
'[1, "simple", "list"]'
mps() 函數的另外一個變體 mp(),直接將對象序列化到一個文件。所以如果 f 是為寫入而打開的一個 文件對象,我們可以這樣做:
json.mp(x, f)
為了重新解碼對象,如果 f 是為讀取而打開的 文件對象:
x = json.load(f)
3.這種簡單的序列化技術可以處理列表和字典,但序列化任意類實例為 JSON 需要一點額外的努力。 json 模塊的手冊對此有詳細的解釋。
See also
pickle - pickle 模塊
4.與 JSON 不同,pickle 是一個協議,它允許任意復雜的 Python 對象的序列化。因此,它只能用於 Python 而不能用來與其他語言編寫的應用程序進行通信。默認情況下它也是不安全的:如果數據由熟練的攻擊者精心設計, 反序列化來自一個不受信任源的 pickle 數據可以執行任意代碼。

『陸』 如何成為一個程序老手,新手必知的40個小技巧

老鳥和新手的一個很大區別來自於debug的能力。其中最主要又可以從兩方面看出來:

從高層往底層找錯。

科學方法。

0.重構是程序員的主力技能。

工作日誌能提升腦容量。

先用profiler調查,才有臉談優化。

注釋貴精不貴多。杜絕大姨媽般的「例注」。漫山遍野的碎碎念注釋,實際就是背景噪音。

普通程序員+google=超級程序員。

單元測試總是合算的。

不要先寫框架再寫實現。最好反過來,從原型中提煉框架。

代碼結構清晰,其它問題都不算事兒。

好的項目作風硬派,一鍵測試,一鍵發布,一鍵部署; 爛的項目生性猥瑣,口口相傳,不立文字,神神秘秘。

編碼不要畏懼變化,要擁抱變化。

常充電。程序員只有一種死法:土死的。

編程之事,隔離是方向,起名是關鍵,測試是主角,調試是補充,版本控制是後悔葯。

一行代碼一個兵。形成建制才能有戰鬥力。單位規模不宜過大,千人班,萬人排易成萬人坑。

重構/優化/修復Bug,同時只能作一件。

簡單模塊注意封裝,復雜模塊注意分層。

人腦性能有限,整潔勝於雜亂。讀不懂的代碼,嘗試整理下格式; 不好用的介面,嘗試重新封裝下。

迭代速度決定工作強度。想多快好省,就從簡化開發流程,加快迭代速度開始。

忘掉優化寫代碼。過早優化等同惡意破壞;忘掉代碼作優化。優化要基於性能測試,而不是糾結於字里行間。

最好的工具是紙筆;其次好的是markdown。

leader問任務時間,若答不上來,可能是任務拆分還不夠細。

寧可多算一周,不可少估一天。過於「樂觀」容易讓boss受驚嚇。

最有用的語言是English。其次的可能是Python。

百聞不如一見。畫出結果,一目瞭然。調試耗時將大大縮短。

資源、代碼應一道受版本管理。資源匹配錯誤遠比代碼匹配錯誤更難排查。

不要基於想像開發, 要基於原型開發。原型的價值是快速驗證想法,幫大家節省時間。

序列化首選明文文本 。諸如二進制、混淆、加密壓縮等等有需要時再加。

編譯器永遠比你懂微觀優化。只能向它不擅長的方向努力。

不要定過大、過遠、過細的計劃。即使定了也沒有用。

至少半數時間將花在集成上。時間,時間,時間總是不夠。

與主流意見/方法/風格/習慣相悖時,先檢討自己最可靠。

出現bug主動查,不管是不是你的。這能讓你業務能力猛漲、個人形象飆升; 如果你的bug被別人揪出來.....呵呵,那你會很被動~≧﹏≦

不知怎麼選技術書時就挑薄的。起碼不會太貴,且你能看完。

git是最棒的。簡單,可靠,免費。

僅對「可預測的非理性」拋斷言。

Log要寫時間與分類。並且要能重定向輸出。

注釋是稍差的文檔。更好的是清晰的命名。讓代碼講自己的故事。

造輪子是很好的鍛煉方法。前提是你見過別的輪子。

code review最好以小組/結對的形式。對業務有一定了解,建議會更有價值(但不絕對)。而且不會成為負擔。管理員個人review則很容易成team的瓶頸。

提問前先做調研。問不到點上既被鄙視,又浪費自己的時間。

永遠別小看程序媛(╯3╰)!

『柒』 面試asp.net程序員一般會問那些問題啊(急)

C#和ASP.Net面試題目集錦三:

1.new有幾種用法

第一種:new Class();

第二種:覆蓋方法

public new XXXX(){}

第三種:new 約束指定泛型類聲明中的任何類型參數都必須有公共的無參數構造函數。

2.如何把一個array復制到arrayList里

foreach( object o in array )arrayList.Add(o);

3.datagrid.datasouse可以連接什麼數據源 [dataset,datatable,dataview]

dataset,datatable,dataview , IList

4.概述反射和序列化

反射:程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。然後,可以調用類型的方法或訪問其欄位和屬性

序列化:序列化是將對象轉換為容易傳輸的格式的過程。例如,可以序列化一個對象,然後使用 HTTP 通過 Internet 在客戶端和伺服器之間傳輸該對象。在另一端,反序列化將從該流重新構造對象。

5.概述o/r mapping 的原理

利用反射,配置 將類於資料庫表映射

6.類成員有( )種可訪問形式

可訪問形式?不懂。

可訪問性:public ,protected ,private,internal

7.用sealed修飾的類有什麼特點

sealed 修飾符用於防止從所修飾的類派生出其它類。如果一個密封類被指定為其他類的基類,則會發生編譯時錯誤。

密封類不能同時為抽象類。

sealed 修飾符主要用於防止非有意的派生,但是它還能促使某些運行時優化。具體說來,由於密封類永遠不會有任何派生類,所以對密封類的實例的虛擬函數成員的調用可以轉換為非虛擬調用來處理。

8.列舉ADO.NET中的五個主要對象,並簡單描述

connection,command,dataReader,trans,dataset ...

9.執行下面代碼後:

String strTemp ="abcdefg 某某某";

Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;

Int j = strTemp.Length;

問:i=(14 ) ;j=(11 )

i=(14 ) ;j=(11 ) 中文兩個位元組

10.C#中,string str = null 與 string str ="",請盡量用文字說明區別。(要點:說明詳細的內存空間分配)

string str ="" 分配空間

11.詳述.NET里class和struct的異同!

class:放在 ? struct放在?

struct值傳遞

類與結構有很多相似之處:結構可以實現介面,並且可以具有與類相同的成員類型。然而,結構在幾個重要方面不同於類:結構為值類型而不是引用類型,並且結構不支持繼承。結構的值存儲在「在堆棧上」或「內聯」。細心的程序員有時可以通過聰明地使用結構來增強性能。

12.概述.NET里對 remoting 和 webservice 兩項技術的理解和實際中的應用。

遠程邏輯調用,remoing介面只能用在.net中

13.什麼是code-behind技術

aspx and cs

14.概述三層結構體系

web/business/dataaccess

15.asp.net如何實現MVC模式,舉例說明!

web/business/dataaccess

好多網站多有呢??你自己找一找,還有最好做一個項目,有的不會問技術問題,你自己去了就知道了。主要是作品,記得把簡歷寫好。

閱讀全文

與程序員的序列化相關的資料

熱點內容
怎麼使用access的命令按鈕 瀏覽:897
有點錢app在哪裡下載 瀏覽:832
博途v15解壓後無法安裝 瀏覽:203
什麼是根伺服器主機 瀏覽:436
安卓手游怎麼申請退款 瀏覽:553
安卓系統如何分享網頁 瀏覽:278
ad如何編譯pcb工程 瀏覽:412
除了滴滴app哪裡還能用滴滴 瀏覽:399
截圖怎麼保存文件夾然後壓縮 瀏覽:8
幻影伺服器怎麼樣 瀏覽:27
具體哪些廣東公司招程序員 瀏覽:870
嵌入式編譯器教程 瀏覽:306
ssl數據加密傳輸 瀏覽:86
51單片機定時器方式2 瀏覽:331
命令行查看開機時間 瀏覽:813
python微博復雜網路分析 瀏覽:550
rf3148編程器 瀏覽:505
浙江標准網路伺服器機櫃雲主機 瀏覽:589
設置網路的伺服器地址 瀏覽:600
java圖形界面設計 瀏覽:751