简介
什么是Kryo
Kryo同其他序列化框架的对比(Java比较流行的序列化框架)
优点 | 缺点 | |
---|---|---|
Kryo | 速度快,序列化后体积小 | 跨语言支持较复杂 |
Hessian | 默认支持跨语言 | 较慢 |
Protostuff | 速度快,基于protobuf | 需静态编译 |
什么是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 <Foundation/Foundation.h>
#import "SerializationAnnotation.h"
#import "JInteger.h"
#import "JLong.h"
@interface TestSVO : NSObject <SerializationAnnotation>
// 更多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的基本使用就告一段落了。