BRSerialization 1.0

BRSerialization 1.0

Elie Melki 维护。



  • Elie Melki

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