归档和解档-Archiver
生活随笔
收集整理的這篇文章主要介紹了
归档和解档-Archiver
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、概念
1.歸檔用于保存對象,包括被歸檔對象之間的各種相互關系或者依賴性。解檔用于重建以前歸檔的對象與關系。在其它面向對象的語言中,一般使用術語"序列化"來描述歸檔解檔模式。
2.歸檔的對象通常存儲為二進制數據,可以在內存或者磁盤中讀取,寫入。不過在Cocoa中,也有一些對象使用XML文件進行歸檔和解檔,比如NSArray,NSDictionary等等,這是Cocoa中關于歸檔解檔模式的另一個體現。
3.實現歸檔和解檔模式的關鍵是相關對象的處理。不管對象之間的關系有多復雜,歸檔中的每個對象在那個歸檔中只會編碼一次,也就是說,如果許多歸檔的對象都引用相同的對象,則這個對象只會編碼一次,這就最小化了歸檔所需的存儲空間。
4.有條件的編碼:在許多對象彼此相關但是并非所有關系都需要保留下來的情況下,可以有條件的選擇只對某些對象進行歸檔。
二、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{ ? ?? ? [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用于歸檔相關對象,生成NSData;NSKeyedUnarchiver用于解檔對象,從NSData解碼出對象。
3.NSKeyedArchiver和NSKeyedUnarchiver相關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方便的實現單個對象的歸檔和解檔,如果要將多個對象歸檔在一起,可以用以下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.歸檔用于保存對象,包括被歸檔對象之間的各種相互關系或者依賴性。解檔用于重建以前歸檔的對象與關系。在其它面向對象的語言中,一般使用術語"序列化"來描述歸檔解檔模式。
2.歸檔的對象通常存儲為二進制數據,可以在內存或者磁盤中讀取,寫入。不過在Cocoa中,也有一些對象使用XML文件進行歸檔和解檔,比如NSArray,NSDictionary等等,這是Cocoa中關于歸檔解檔模式的另一個體現。
3.實現歸檔和解檔模式的關鍵是相關對象的處理。不管對象之間的關系有多復雜,歸檔中的每個對象在那個歸檔中只會編碼一次,也就是說,如果許多歸檔的對象都引用相同的對象,則這個對象只會編碼一次,這就最小化了歸檔所需的存儲空間。
4.有條件的編碼:在許多對象彼此相關但是并非所有關系都需要保留下來的情況下,可以有條件的選擇只對某些對象進行歸檔。
二、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{ ? ?? ? [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用于歸檔相關對象,生成NSData;NSKeyedUnarchiver用于解檔對象,從NSData解碼出對象。
3.NSKeyedArchiver和NSKeyedUnarchiver相關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方便的實現單個對象的歸檔和解檔,如果要將多個對象歸檔在一起,可以用以下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。采用二進制的格式比采用文本的格式占用的空間小,讀寫速度高。
總結
以上是生活随笔為你收集整理的归档和解档-Archiver的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用OC进行iOS截屏,同时保证清晰度
- 下一篇: 我们的java项目,要不要废弃switc