java protostuff 序列化反序列化工具
protostuff是由谷歌开发的一个非常优秀的序列化反序列化工具
maven导入包:
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.6.0</version>
</dependency>
java代码如下:
package com.common.utils; import io.protostuff.LinkedBuffer;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema; /**
*
* @desc protobuf序列化反序列化工具
* @author wulm
*/
public class ProtostuffUtil{ /**
* @desc protostuff 目前不支持直接序列化List等对象,需要使用普通的POJO包装一下
* @author wulm
*/
private static class SerializeData {
private Object target; public Object getTarget() {
return target;
} public void setTarget(Object target) {
this.target = target;
}
} private static final ThreadLocal<LinkedBuffer> BUFFER_THREAD_LOCAL = ThreadLocal
.withInitial(() -> LinkedBuffer.allocate(512)); /**
* @desc 序列化
* @auth wulm
*/
@SuppressWarnings("unchecked")
public static byte[] serialize(Object obj) {
SerializeData data = new SerializeData();
data.setTarget(obj); // this is lazily created and cached by RuntimeSchema
// so its safe to call RuntimeSchema.getSchema(Foo.class) over and over
// The getSchema method is also thread-safe
Schema<SerializeData> schema = RuntimeSchema.getSchema((Class<SerializeData>) data.getClass()); // Re-use (manage) this buffer to avoid allocating on every serialization
// LinkedBuffer buffer = LinkedBuffer.allocate(512);
LinkedBuffer buffer = BUFFER_THREAD_LOCAL.get(); // ser
try {
return ProtostuffIOUtil.toByteArray(data, schema, buffer);
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
} finally {
buffer.clear();
} } /**
*
* @desc 反序列化
* @auth wulm
*/
@SuppressWarnings("unchecked")
public static <T> T deserialize(byte[] data, Class<T> cls) {
Schema<SerializeData> schema = RuntimeSchema.getSchema(SerializeData.class);
// deser
SerializeData message = schema.newMessage();
ProtostuffIOUtil.mergeFrom(data, message, schema); return (T) message.getTarget();
} // public static class Aaa {
//
// public static void main(String[] args) {
//
// Aaa aaa = new Aaa();
// aaa.setA("你好呀");
// aaa.setB("我是佩琪");
// aaa.setC("你好");
// aaa.setD("我是猪爸爸");
//
// List<Aaa> list = new ArrayList<>();
// list.add(aaa);
//
// byte[] serialize = ProtostuffUtil.serialize(list);
//
// List<Aaa> bb = ProtostuffUtil.deserialize(serialize,
// List.class);
//
// System.out.println(JacksonUtils.writeValueAsString(bb));
//
// }
//
// private String a;
// private String b;
// private String c;
// private String d;
//
// public String getA() {
// return a;
// }
//
// public void setA(String a) {
// this.a = a;
// }
//
// public String getB() {
// return b;
// }
//
// public void setB(String b) {
// this.b = b;
// }
//
// public String getC() {
// return c;
// }
//
// public void setC(String c) {
// this.c = c;
// }
//
// public String getD() {
// return d;
// }
//
// public void setD(String d) {
// this.d = d;
// }
//
// }
}
参阅资料:
https://github.com/protostuff/protostuff
http://www.zhangleiup.com/post/112.htm
http://www.cnblogs.com/wolf-bin/p/9269987.html
java protostuff 序列化反序列化工具的更多相关文章
- Java对象序列化/反序列化的注意事项(转)
Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...
- Java对象序列化/反序列化的注意事项
Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...
- java基础 序列化反序列化流 实现Serializable 接口 自动装载序列号到对象文本文件如修改不能反序列化对象文本,除非自定义long型常量 打印流
package com.swift.baseKnowledge; import java.io.File; import java.io.FileInputStream; import java.io ...
- c#序列化反序列化工具(json,binary,xml)
using System; using System.Text; using System.IO; using System.Runtime.Serialization.Formatters.Bina ...
- java序列化/反序列化之xstream、protobuf、protostuff 的比较与使用例子
目录 背景 测试 环境 工具 说明 结果 结论 xstream简单教程 准备 代码 protobuf简单教程 快速入门 下载.exe编译器 编写.proto文件 利用编译器编译.proto文件生成ja ...
- Java对象序列化和反序列化的工具方法
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- Protostuff序列化和反序列化
序列化和反序列化是在应对网络编程最常遇到的问题之一. 序列化就是将Java Object转成byte[]:反序列化就是将byte[]转成Java Object. 这里不介绍JDK serializab ...
- java之序列化与反序列化
1.这里主要是介绍Protobuf提供的序列化与反序列化的高效性.相对于传统的java提供的序列化来说,Protobuf的效率提高了很多倍.但是也有不足的地方,就是proto在对象序列化的时候抛弃了很 ...
- SerializeUtil 序列化,反序列化工具类
package cloud.app.prod.home.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutp ...
随机推荐
- vim note(5)
.vimrc 的设置 $HOME/.vimrc 的普通设置,例如以下. set nocompatible "" not compatible with VI "" ...
- Rust hello world 语法解说
Rust的hello world代码例如以下: fn main() { println!("Hello, world!"); } 1.fn main() fn main(){ ...
- Eclipse 常用快捷键及使用技巧
做 java 开发的,经常会用 Eclipse 或者 MyEclise 集成开发环境,一些实用的 Eclipse 快捷键和使用技巧,可以在平常开发中节约出很多时间提高工作效率,下面我就结合自己开发中的 ...
- CentOS 6.4安装Ganglia
samba 1.这里安装的是3.1.7版本,web前端是最新版本,安装前期环境(yum源用的是本地的) yum -y insatll php php-gd rrdtools apr-devel apr ...
- DSPC6748中某问题的解决方式
因为之前没有做过DSP相关的开发,属于菜鸟中的菜鸟.出现故障后.不知道从哪方面来解决这些小问题. 开发环境:CCS5.5.0 开发板:TI公司的TMS320C6748 问题: 控制台出现初始化结束后多 ...
- easyUI datagrid 前端假分页
datagrid有两种分页方式,真分页和假分页. 所谓真分页,就是真的每次只获取一张分页的数据. 所谓假分页,就是将所有数据全部获取下来,然后利用其分页控件进行分页. 下面具体说说假分页: 1.dat ...
- jeasyUI treegrid 的 reload 和 getChanges
看上去,treegrid继承自datagrid,因此,datagrid有的,treegrid也会有. 比如说,getChanges,翻看那些网络教程,绝大多数都没提treegrid有这个东东.但是,t ...
- USACO Section 1.2PROB Transformations
挺有趣的一道题,呵呵,不算难 /* ID: jusonal1 PROG: transform LANG: C++ */ #include <iostream> #include <f ...
- hdoj--1716--排列2(暴力水题)
排列2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- POJ1265 Area 多边形内格点数 Pick公式
POJ1265给定一个多边形 计算边上的格点 内部的格点 以及多边形的面积 利用Pick公式 面积=内部格点数+边上格点数/2-1 将多边形分割为三角形容易证得上述公式 计算面积用叉积,计算边上格点 ...