protobuf是Google推出的一种高效的序列化对象的方式,protostuff是基于protobuf的更容易使用的JAVA工具包。更加方便实现对象的序列化和反序列化。
代码如下:
进行序列化反序列化ProtoStuffUtilio.protostuff protostuff-runtime 1.7.2 io.protostuff protostuff-core 1.7.2
public class ProtoStuffUtil {
// proto stuff提供了简单的api,可以很方便的进行对象的序列化和反序列化,而不用像protoBuf还要去写.proto文件和生成对应的代码
// 用来初始化buffer对象
private static final ThreadLocal linkED_BUFFER = new ThreadLocal<>();
@SuppressWarnings("unchecked")
public static byte[] serialize(T obj) {
// 将对象序列化为byte数组
Class clazz = (Class) obj.getClass();
Schema schema = RuntimeSchema.getSchema(clazz);
byte[] data;
linkedBuffer buffer = getBuffer();
try {
data = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
} finally {
// 清空buffer对象
buffer.clear();
}
return data;
}
public static void write(OutputStream stream, T value) throws IOException {
// 将对象序列化到输出流
Class clazz = (Class) value.getClass();
Schema schema = RuntimeSchema.getSchema(clazz);
linkedBuffer buffer = getBuffer();
try {
ProtobufIOUtil.writeTo(stream, value, schema, buffer);
} finally {
buffer.clear();
}
}
public static T deserialize(byte[] data, Class clazz) {
// 将数组反序列化成对象
Schema schema = RuntimeSchema.getSchema(clazz);
T obj = schema.newMessage();
ProtostuffIOUtil.mergeFrom(data, obj, schema);
return obj;
}
public static T deserialize(InputStream stream, Class clazz) throws IOException {
// 将输入流序列化成对象
Schema schema = RuntimeSchema.getSchema(clazz);
T obj = schema.newMessage();
ProtostuffIOUtil.mergeFrom(stream, obj, schema);
return obj;
}
private static linkedBuffer getBuffer() {
// 创建buffer,threadLocal没有的时候申请一个新的放进去,每个线程持有一个buffer对象,减少buffer对象的创建
linkedBuffer linkedBuffer = linkED_BUFFER.get();
if (linkedBuffer == null) {
linkedBuffer = linkedBuffer.allocate(linkedBuffer.DEFAULT_BUFFER_SIZE);
linkED_BUFFER.set(linkedBuffer);
}
return linkedBuffer;
}
}
注册Spring的参数解析器和消息转换器
@Slf4j public class ProtoStuffHttpMessageConverter extends AbstractHttpMessageConverter测试接口
// 实体对象
@Data
public class User {
private Integer id;
private String name;
}
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("insert")
public String insert(@ProtoStuffRequest User user) {
userMapper.insertUser(user);
return "success";
}
// 二是使用@RequestBody注解,但是要在请求的请求头中加上Content-Type application/x-protobuf
@GetMapping("insert1")
public String insert1(@RequestBody User user) {
userMapper.insertUser(user);
return "success";
}
@GetMapping("query")
public User query(Integer id) {
return userMapper.selectUser(id);
}
}
测试结果
对象序列化:
对象反序列化:
insert:
insert1:



