BRSerialization SDK
BRSerialization SDK 允许您将复杂对象序列化和反序列化为基本数据类型(可以是一个有效的 JSON 对象或 plist),来回互转。
BRSerialization SDK 提供了一个扩展,可以直接将 JSON 数据序列化为复杂对象,反之亦然。它也可以作为 SOAP 的基本入口。
目录
如何工作?
SDK 的主要组件是 Serializer(序列化器)、Deserializer(反序列化器)和 ISerialization。
@protocol BRDeserializer <NSObject>
- (id) deserialize:(id)theData;
@end
@protocol BRSerializer <NSObject>
- (id) serialize:(id)theObject;
@end
@protocol BRISerialization <BRDeserializer,BRSerializer>
@end
要创建序列化器/反序列化器,您创建一个同时符合 BRDeserializer、BRSerializer 协议的对象,或者通过符合 BRISerialization 协议来同时符合这两个协议。
您将覆盖以下方法
- (id) serialize:(id)theObject;
- (id) deserialize:(id)theData;
查看下面的示例。这里我们需要将一个复杂的 NSUUID 对象转换为基本数据类型,这个例子中是一个 NSString。
serialize 方法期望接受一个被转换为 NSString 的 NSSUUID,而 deserialize 方法期望接受一个被转换为 NSSUUID 的 NSString。
为了说明,让我们看看 NSSUIDSerialization 的实现。
- (NSString *) serialize:(NSUUID *)theObject
{
if ([theObject isKindOfClass:[NSUUID class]])
{
NSUUID *uuid = (NSUUID *)theObject;
return uuid.UUIDString;
}
else
return nil;
}
- (NSUUID *) deserialize:(NSString *)theData
{
if ([theData isKindOfClass:[NSString class]])
return [[NSUUID alloc] initWithUUIDString:theData];
else if (theData != nil && ![theData isKindOfClass:[NSNull class]])
@throw [NSException exceptionWithName:NSInternalInconsistencyException
reason:[NSString stringWithFormat:@"Expected an NSString for %@ found %@", theData, [theData class]]
userInfo:nil];
return nil;
}
一旦有了序列化数据,您可以使用 BRSerializationFacade 来帮您完成工作。
BRSerializationFacade 有以下方法
+ (id) serializeObject:(id)object
serialiser:(id<BRSerializer>)serializer
error:(__autoreleasing NSError **)error;
+ (id) deserializeData:(id)data
deserialiser:(id<BRDeserializer>)deserializer
error:(__autoreleasing NSError **)error;
NSSUIDSerialization *serialization = [NSSUIDSerialization new];
//serialise NUUID to NSString
NSUUID *uuid = [NSUUID UUID];
NSString *uuidString = [BRSerializationFacade serializeObject:uuid serialiser:serialization error:nil];
//Deserialize NSString to NSUUID
NSUUID *newuuid = [BRSerializationFacade deserializeData:uuidString serialiser:serialization error:nil];
SDK 已经包括了用于基本需求的方便的序列化类。主要的是 BRObjectSerialization 用于对象序列化,BRTypedArraySerialization 用于对象数组等...
您仍然可以为自己的任何复杂对象添加自己的。
对象序列化
BRObjectSerialization 类将复杂对象转换为 NSDictionary。
以客户对象为例
@interface Customer : NSObject
@property (nonatomic, strong) NSString *identifier;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSURL *websiteURL;
@property (nonatomic, strong) NSURL *contactURL;
@end
使用以下值序列化实例
Customer *c = [[Customer alloc] init];
c.identifier = @"1234";
c.name = @"name";
c.websiteURL = [NSURL URLWithString:@"http://www.google.com"];
c.contactURL = [NSURL URLWithString:@"http://www.google.com/ContactUs"];
将产生以下 NSDictionary
@{
"id" : "1234",
"name" : "name",
"websiteURL" : "http://www.google.com",
"contactURL" : "/ContactUs"
}
如您所见,客户对象被转换为 NSDictionary。具有基本数据类型(如标识符和名称)的属性保持相同的数据类型。具有 complex 数据类型(如 websiteURL 和 contactURL)的 NSURL 属性最终被转换为 NSString。
反序列化得到的 NSDictionary 将将其转换回复杂对象。
如何配置 BRObjectSerialization 以实现上述结果。
@implementation Customer
+ (BRObjectSerialization *) serialization
{
Class clazz = [Customer class];
NSString *nameProperty = NSStringFromSelector(@selector(name));
NSString *identifierProperty = NSStringFromSelector(@selector(identifier));
NSString *websiteURLProperty = NSStringFromSelector(@selector(websiteURL));
NSString *contactURLProperty = NSStringFromSelector(@selector(contactURL));
BRObjectSerialization *_serialisation = [BRObjectSerialization objectSerializationWith:clazz
propertiesMapper:[OrderedDictionary dictionaryWithObjectsAndKeys:
@"id",identifierProperty,
@"name",nameProperty,
@"websiteURL", websiteURLProperty,
@"contactURL", contactURLProperty,
nil]];
[_serialisation addSerialization:[BRAbsoluteURLSerialization absoluteURLSerialization] forProperty:websiteURLProperty];
[_serialisation addSerialization:[BRRelativeURLSerialization relativeSerializationWithBaseURL:
[NSURL URLWithString:@"http://www.google.com"]]
forProperty:contactURLProperty];
return _serialisation;
}
@end
BRObjectSerialization 需要您识别对象类型并提供属性映射器。您将感兴趣的属性映射到它们特定的键。您可以看到我 why I use NSStringFromSelector 只是保持类型。此外,每个需要特殊序列化的属性,您都需要通过调用 addSerialization 将其传递给 BRObjectSerialization。
如果 Customer 有一个名为 owner 的 Owner 类的属性。您将需要一个 Owner 的 BRObjectSerialization,并将其传递给 Customer 的 BRObjectSerialization 序列化。
取以上示例并查看附加代码。
@interface Owner : NSObject
@property (nonatomic, strong) NSString *phoneNumber;
@end
@interface Customer : NSObject
...
@property (nonatomic,strong) Owner name
@end
Owner BRObjectSerialization
@implementation Owner
+ (BRObjectSerialization *) serialization
{
Class clazz = [Owner class];
NSString *phoneNumberProperty = NSStringFromSelector(@selector(phoneNumber));
BRObjectSerialization *_serialisation = [BRObjectSerialization objectSerializationWith:clazz
propertiesMapper:[OrderedDictionary dictionaryWithObjectsAndKeys:
@"phoneNumberProperty",phoneNumberProperty,
return _serialisation;
}
@end
Customer BRObjectSerialization
+ (BRObjectSerialization *) serialization
{
Class clazz = [Customer class];
...
NSString *onwerProperty = NSStringFromSelector(@selector(owner));
BRObjectSerialization *_serialisation = [BRObjectSerialization objectSerializationWith:clazz
propertiesMapper:[OrderedDictionary dictionaryWithObjectsAndKeys:
...
@"owner", onwerProperty,
nil]];
...
[_serialisation addSerialization:[Owner serialization]
forProperty:onwerProperty];
return _serialisation;
}
@end
安装
目前您可以下载项目,并将 BRSerialization 项目添加为子项目。您还可以直接通过 git url 使用 Cocoapod。稍后我们将将其库推送到公共 Cocoapod 仓库。
pod BRSerialization, git => https://github.com/eliemelki/iOS-Serialization