KryoCocoa

简介

什么是Kryo

Kryo 是一个快速高效的Java对象图形序列化框架,主要特点是性能、高效和易用。该项目用来序列化对象到文件、数据库或者网络。
http://code.google.com/p/kryo

Kryo同其他序列化框架的对比(Java比较流行的序列化框架)
优点 缺点
Kryo 速度快,序列化后体积小 跨语言支持较复杂
Hessian 默认支持跨语言 较慢
Protostuff 速度快,基于protobuf 需静态编译
什么是KryoCocoa

其实KryoCocoa就是Java中Kryo序列化框架的Objective-C版,是为了兼容Kryo和基本的Java数据类型的。
这里是KryoCocoa的地址:https://github.com/Feuerwerk/kryococoa

基本使用

一、将对象序列化后写入某个文件中
假如有以下实体类:

@interface ClassA : NSObject
@property (assign, nonatomic) SInt32 uid;
@property (copy, nonatomic) NSString *name;
@end

将该实体类序列化后写入到某个路径下的某个文件

ClassA *a = [[ClassA alloc] init];
a.uid = 1;
a.name = @"lisi";

NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
KryoOutput *output = [[KryoOutput alloc] initWithStream:outputStream];
[k writeObject:a to:output];
    
[output close];

二、读取某个文件反序列化成一个对象

NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:filePath];
KryoInput *input = [[KryoInput alloc] initWithInput:inputStream];
ClassA *a = [k readObject:input ofClass:[ClassA class]];

[input close];
NSLog(@"%d %@", a.uid,a.name);

序列化对象后通过Socket与Java后台交互


假设有一个这样的java实体类

package com.test.web.socket.modules.user.svo;

public class TestSVO {
    
    private Long uid;
    
    private Integer status;

    public Long getUid() {
        return uid;
    }

    public void setUid(Long uid) {
        this.uid = uid;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }
    
}

我们在Xcode中应该这样定义

#import 
#import "SerializationAnnotation.h"
#import "JInteger.h"
#import "JLong.h"

@interface TestSVO : NSObject 
// 更多OC对应java类型可在git上面查到,不一一列举了
@property (strong, nonatomic) JLong *uid;
@property (strong, nonatomic) JInteger *status;

@end
#import "TestSVO.h"

@implementation TestSVO

+ (NSString *)serializingAlias
{
    //这里返回的java中的完整报名+类名,否则会出问题
    return @"com.test.web.socket.modules.user.svo.TestSVO";
}

@end

假设我们要将上面的对象通过socket发送给服务器

    Kryo *k = [Kryo new];
    // 创建一个内存输出流 用于输出Kryo序列化后的东西
    NSOutputStream *outputStream = [[NSOutputStream alloc] initToMemory];
    // KryoOutput这个类实际上就是NSOutputStream的子类
    KryoOutput *output = [[KryoOutput alloc] initWithStream:outputStream];
    
    [k writeObject:message to:output];
    // toData获取到NSData
    NSData *contents = output.toData;
    
    int len = (int)contents.length;
    // 发送数据
    NSData *lengthData = [NSData dataWithBytes:&len length:sizeof(len)];
    [self.socket writeData:[self descBytesWithNSData:lengthData] withTimeout:WRITE_TIME_OUT tag:0];
    [self.socket writeData:contents withTimeout:WRITE_TIME_OUT tag:0];
    
    [output close];

这样子,Kryo的基本使用就告一段落了。

你可能感兴趣的:(KryoCocoa)