归档和解档-Archiver
生活随笔
收集整理的這篇文章主要介紹了
归档和解档-Archiver
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、概念
1.歸檔用于保存對象,包括被歸檔對象之間的各種相互關(guān)系或者依賴性。解檔用于重建以前歸檔的對象與關(guān)系。在其它面向?qū)ο蟮恼Z言中,一般使用術(shù)語"序列化"來描述歸檔解檔模式。
2.歸檔的對象通常存儲為二進(jìn)制數(shù)據(jù),可以在內(nèi)存或者磁盤中讀取,寫入。不過在Cocoa中,也有一些對象使用XML文件進(jìn)行歸檔和解檔,比如NSArray,NSDictionary等等,這是Cocoa中關(guān)于歸檔解檔模式的另一個(gè)體現(xiàn)。
3.實(shí)現(xiàn)歸檔和解檔模式的關(guān)鍵是相關(guān)對象的處理。不管對象之間的關(guān)系有多復(fù)雜,歸檔中的每個(gè)對象在那個(gè)歸檔中只會編碼一次,也就是說,如果許多歸檔的對象都引用相同的對象,則這個(gè)對象只會編碼一次,這就最小化了歸檔所需的存儲空間。
4.有條件的編碼:在許多對象彼此相關(guān)但是并非所有關(guān)系都需要保留下來的情況下,可以有條件的選擇只對某些對象進(jìn)行歸檔。
二、Cocoa中的實(shí)現(xiàn)
1.NSCoding協(xié)議:
(1)當(dāng)一個(gè)對象要實(shí)現(xiàn)歸檔解檔操作,需要?dú)w檔的對象必須要實(shí)現(xiàn)NSCoding協(xié)議。
(2)NSCoding協(xié)議包含兩個(gè)方法:encodeWithCoder:,initWithCoder:。
(3)encodeWithCoder實(shí)現(xiàn)對象編碼,initWithCoder實(shí)現(xiàn)對象解碼。兩個(gè)方法的參數(shù)是NSCoder類實(shí)例,是對象編碼解碼器,可以將實(shí)例對象的屬性直接編碼或者以key-value的方式編碼,解碼也一樣。? ? 類似的方法如下(每種數(shù)據(jù)類型都有相關(guān)的方法支持):? ? encodeObject:? ? encodeObject:forKey:? ? encodeInt:forKey:? ? decodeObject? ? decodeObjectForKey:? ? decodeIntForKey:
(4)編碼和解碼是對象迭代的一個(gè)過程,可能encodeObject:ObjectA方法又會引起ObjectA的encodeWithCoder被調(diào)用。
(5)NSCoding實(shí)現(xiàn)示例:- (void)encodeWithCoder:(NSCoder*)coder{ ? ?? ? [coder encodeObject:self.userName forKey:SAMPLEDATA_KEY_USERNAME]; ?? ? [coder encodeInt:self.age forKey:SAMPLEDATA_KEY_AGE]; ?? ? [coder encodeBool:self.gender forKey:SAMPLEDATA_KEY_GENDER]; ?? ? [coder encodeObject:self.friends forKey:k_FRIENDS]; ?? ? [coder encodeObject:self.address forKey:k_ADDRESS]; ?? ? [coder encodeObject:self.addresses forKey:k_userEntity_addresses]; ?} ? ??- (id)initWithCoder:(NSCoder*)decoder{ ? ?? ? if (self = [super init]) ?{ ?? ? ? ? if (decoder == nil) ?{ ?? ? ? ? ? ?return self;? ? ? ? } ?? ? ? ? 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用于歸檔相關(guān)對象,生成NSData;NSKeyedUnarchiver用于解檔對象,從NSData解碼出對象。
3.NSKeyedArchiver和NSKeyedUnarchiver相關(guān)API:
(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方便的實(shí)現(xiàn)單個(gè)對象的歸檔和解檔,如果要將多個(gè)對象歸檔在一起,可以用以下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有一個(gè)屬性outputFormat,類型為NSPropertyListFormat,指定編碼器的編碼格式。有兩個(gè)可用的值:NSPropertyListXMLFormat_v1_0 和 NSPropertyListBinaryFormat_v1_0。采用二進(jìn)制的格式比采用文本的格式占用的空間小,讀寫速度高。
1.歸檔用于保存對象,包括被歸檔對象之間的各種相互關(guān)系或者依賴性。解檔用于重建以前歸檔的對象與關(guān)系。在其它面向?qū)ο蟮恼Z言中,一般使用術(shù)語"序列化"來描述歸檔解檔模式。
2.歸檔的對象通常存儲為二進(jìn)制數(shù)據(jù),可以在內(nèi)存或者磁盤中讀取,寫入。不過在Cocoa中,也有一些對象使用XML文件進(jìn)行歸檔和解檔,比如NSArray,NSDictionary等等,這是Cocoa中關(guān)于歸檔解檔模式的另一個(gè)體現(xiàn)。
3.實(shí)現(xiàn)歸檔和解檔模式的關(guān)鍵是相關(guān)對象的處理。不管對象之間的關(guān)系有多復(fù)雜,歸檔中的每個(gè)對象在那個(gè)歸檔中只會編碼一次,也就是說,如果許多歸檔的對象都引用相同的對象,則這個(gè)對象只會編碼一次,這就最小化了歸檔所需的存儲空間。
4.有條件的編碼:在許多對象彼此相關(guān)但是并非所有關(guān)系都需要保留下來的情況下,可以有條件的選擇只對某些對象進(jìn)行歸檔。
二、Cocoa中的實(shí)現(xiàn)
1.NSCoding協(xié)議:
(1)當(dāng)一個(gè)對象要實(shí)現(xiàn)歸檔解檔操作,需要?dú)w檔的對象必須要實(shí)現(xiàn)NSCoding協(xié)議。
(2)NSCoding協(xié)議包含兩個(gè)方法:encodeWithCoder:,initWithCoder:。
(3)encodeWithCoder實(shí)現(xiàn)對象編碼,initWithCoder實(shí)現(xiàn)對象解碼。兩個(gè)方法的參數(shù)是NSCoder類實(shí)例,是對象編碼解碼器,可以將實(shí)例對象的屬性直接編碼或者以key-value的方式編碼,解碼也一樣。? ? 類似的方法如下(每種數(shù)據(jù)類型都有相關(guān)的方法支持):? ? encodeObject:? ? encodeObject:forKey:? ? encodeInt:forKey:? ? decodeObject? ? decodeObjectForKey:? ? decodeIntForKey:
(4)編碼和解碼是對象迭代的一個(gè)過程,可能encodeObject:ObjectA方法又會引起ObjectA的encodeWithCoder被調(diào)用。
(5)NSCoding實(shí)現(xiàn)示例:- (void)encodeWithCoder:(NSCoder*)coder{ ? ?? ? [coder encodeObject:self.userName forKey:SAMPLEDATA_KEY_USERNAME]; ?? ? [coder encodeInt:self.age forKey:SAMPLEDATA_KEY_AGE]; ?? ? [coder encodeBool:self.gender forKey:SAMPLEDATA_KEY_GENDER]; ?? ? [coder encodeObject:self.friends forKey:k_FRIENDS]; ?? ? [coder encodeObject:self.address forKey:k_ADDRESS]; ?? ? [coder encodeObject:self.addresses forKey:k_userEntity_addresses]; ?} ? ??- (id)initWithCoder:(NSCoder*)decoder{ ? ?? ? if (self = [super init]) ?{ ?? ? ? ? if (decoder == nil) ?{ ?? ? ? ? ? ?return self;? ? ? ? } ?? ? ? ? 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用于歸檔相關(guān)對象,生成NSData;NSKeyedUnarchiver用于解檔對象,從NSData解碼出對象。
3.NSKeyedArchiver和NSKeyedUnarchiver相關(guān)API:
(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方便的實(shí)現(xiàn)單個(gè)對象的歸檔和解檔,如果要將多個(gè)對象歸檔在一起,可以用以下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有一個(gè)屬性outputFormat,類型為NSPropertyListFormat,指定編碼器的編碼格式。有兩個(gè)可用的值:NSPropertyListXMLFormat_v1_0 和 NSPropertyListBinaryFormat_v1_0。采用二進(jìn)制的格式比采用文本的格式占用的空間小,讀寫速度高。
總結(jié)
以上是生活随笔為你收集整理的归档和解档-Archiver的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用OC进行iOS截屏,同时保证清晰度
- 下一篇: 我们的java项目,要不要废弃switc