歸檔和解檔 Archiver

2021-07-26 19:10:48 字數 2647 閱讀 4329

一、概念

1.歸檔用於儲存物件,包括被歸檔物件之間的各種相互關係或者依賴性。解檔用於重建以前歸檔的物件與關係。在其它物件導向的語言中,一般使用術語"序列化"來描述歸檔解檔模式。

2.歸檔的物件通常儲存為二進位制資料,可以在記憶體或者磁碟中讀取,寫入。不過在cocoa中,也有一些物件使用xml檔案進行歸檔和解檔,比如nsarray,nsdictionary等等,這是cocoa中關於歸檔解檔模式的另乙個體現。

3.實現歸檔和解檔模式的關鍵是相關物件的處理。不管物件之間的關係有多複雜,歸檔中的每個物件在那個歸檔中只會編碼一次,也就是說,如果許多歸檔的物件都引用相同的物件,則這個物件只會編碼一次,這就最小化了歸檔所需的儲存空間。

二、cocoa中的實現

1.nscoding協議:

(1)當乙個物件要實現歸檔解檔操作,需要歸檔的物件必須要實現nscoding協議。

(2)nscoding協議包含兩個方法:encodewithcoder:,initwithcoder:。

(3)encodewithcoder實現物件編碼,initwithcoder實現物件解碼。兩個方法的引數是nscoder類例項,是物件編碼解碼器,可以將例項物件的屬性直接編碼或者以key-value的方式編碼,解碼也一樣。

encodeobject:

encodeobject:forkey:

encodeint:forkey:

decodeobject

decodeobjectforkey:

decodeintforkey:

(4)編碼和解碼是物件迭代的乙個過程,可能encodeobject:objecta方法又會引起objecta的encodewithcoder被呼叫。

(5)nscoding實現示例:

- (void)encodewithcoder:(nscoder*)coder    

- (id)initwithcoder:(nscoder*)decoder  

self.username = [decoder decodeobjectforkey:sampledata_key_username];  

self.gender = [decoder decodeboolforkey:sampledata_key_gender];  

self.age = [decoder decodeintforkey:sampledata_key_age];  

self.friends = [decoder decodeobjectforkey:k_friends];  

self.address = [decoder decodeobjectforkey:k_address];  

self.addresses = [decoder decodeobjectforkey: k_userentity_addresses];  

}  return self;  

2.歸檔和解檔工具類:

nskeyedarchiver用於歸檔相關物件,生成nsdata;

nskeyedunarchiver用於解檔物件,從nsdata解碼出物件。

(1)nsdata *data = [nskeyedarchiver archiveddatawithrootobject:objecta];

nsobject *object = [nskeyedunarchiver unarchiveobjectwithdata:somedata];

(2)bool issucc = [nskeyedarchiver archiverootobject:rootobject tofile:filepath];

nsobject *object = [nskeyedunarchiver unarchiveobjectwithfile:filepath];

(3)以上兩套api方便的實現單個物件的歸檔和解檔,如果要將多個物件歸檔在一起,可以用以下api:

歸檔:nsmutabledata *data = [[nsmutabledata alloc] init];

nskeyedarchiver *archiver = [[nskeyedarchiver alloc] initforwritingwithmutabledata:data];

[archiver encodeobject:objecta forkey:@"keya"];

[archiver encodeobject:objectb forkey:@"keyb"];

[archiver encodeint:3 forkey:@"keyc"];

[archiver finishencoding];

[data writetofile:filepath atomically:yes];

[archiver release];

[data release];

解檔:– initforreadingwithdata:

– decodeobjectforkey:

finishdecoding

(4)nskeyedarchiver有乙個屬性outputformat,型別為nspropertylistformat,指定編碼器的編碼格式。有兩個可用的值:nspropertylistxmlformat_v1_0 和 nspropertylistbinaryformat_v1_0。採用二進位制的格式比採用文字的格式占用的空間小,讀寫速度高。

歸檔和解檔

針對於歸檔和解檔,在日常工作當中用的不多,但是它的原理很重要,所以有必要我們重點學習一下 歸檔是 寫入磁碟前將自定義物件轉換成二級制資料,解檔是 將磁碟上的二級制資料轉換成自定義物件 1.建立乙個person物件,寫屬性,遵守協議 在person.h檔案中 import inte ce person...

歸檔和解檔

歸檔 encoder 它是將自定義的物件寫入磁碟前將物件轉成二進位制然後存入磁碟。解檔 decoder 它是將磁碟上儲存的二進位制資料轉換成自定義物件。eg 自定義乙個person物件 h 檔案中 property nonatomic,copy nsstring name property nona...

OC 歸檔和解檔 總結

自定義物件實現協議 m 檔案內實現2個方法 例子 void encodewithcoder nscoder acoder id initwithcoder nscoder adecoder return self 歸檔自定義的型別 person tom person alloc initwithna...