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 序列化反序列化工具的更多相关文章

  1. Java对象序列化/反序列化的注意事项(转)

    Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...

  2. Java对象序列化/反序列化的注意事项

    Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...

  3. java基础 序列化反序列化流 实现Serializable 接口 自动装载序列号到对象文本文件如修改不能反序列化对象文本,除非自定义long型常量 打印流

    package com.swift.baseKnowledge; import java.io.File; import java.io.FileInputStream; import java.io ...

  4. c#序列化反序列化工具(json,binary,xml)

    using System; using System.Text; using System.IO; using System.Runtime.Serialization.Formatters.Bina ...

  5. java序列化/反序列化之xstream、protobuf、protostuff 的比较与使用例子

    目录 背景 测试 环境 工具 说明 结果 结论 xstream简单教程 准备 代码 protobuf简单教程 快速入门 下载.exe编译器 编写.proto文件 利用编译器编译.proto文件生成ja ...

  6. Java对象序列化和反序列化的工具方法

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  7. Protostuff序列化和反序列化

    序列化和反序列化是在应对网络编程最常遇到的问题之一. 序列化就是将Java Object转成byte[]:反序列化就是将byte[]转成Java Object. 这里不介绍JDK serializab ...

  8. java之序列化与反序列化

    1.这里主要是介绍Protobuf提供的序列化与反序列化的高效性.相对于传统的java提供的序列化来说,Protobuf的效率提高了很多倍.但是也有不足的地方,就是proto在对象序列化的时候抛弃了很 ...

  9. SerializeUtil 序列化,反序列化工具类

    package cloud.app.prod.home.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutp ...

随机推荐

  1. Azure Pack演示样例缩放部署架构

  2. JavaScript图片裁剪

    1.jquery 图片裁剪库选择 Jcrop:http://deepliquid.com/content/Jcrop.html imgareaselect:http://odyniec.net/pro ...

  3. Linux服务器 /var/spool/clientmqueue 目录下产生大量文件的删除办法

    检查linux发现server中的磁盘分区空间超过98%,登录到服务器查看 [root@localhost etc]# df -hFilesystem 容量 已用 可用 已用% 挂载点/dev/hda ...

  4. Java 反射 —— 运行时的类型信息

    1. 反射机制的由来 RTTI 机制可以告知某个对象的确切类型,但有一个前提,该类型在编译时必须已知(编译器在编译时打开和检查 .class 文件以获取类型信息).似乎是个很宽松的限制,但假如你获取了 ...

  5. luogu 4429 染色

    bjoi 2018 染色 推了个错误结论得了60分? 题目大意: 一个无重边和自环的无向图,并且对每个点分别给了一个大小为2的颜色集合,只能从这个集合中选一种颜色给这个点染色 求一个染色方案使得没有两 ...

  6. [Codeforces 339D] Xenia and Bit Operations

    [题目链接] https://codeforces.com/problemset/problem/339/D [算法] 线段树模拟即可 时间复杂度 :O(MN) [代码] #include<bi ...

  7. 51Nod 1522 上下序列 —— 区间DP

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1522 区间DP,从大往小加: 新加入一种数有3种加法:全加左边,全 ...

  8. bzoj1791

    1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1680  Solved: 369[Submit][S ...

  9. easyui图标对照

    转自:https://blog.csdn.net/qq_34545192/article/details/78250816 原作者文章地址: http://www.cnblogs.com/timeme ...

  10. bzoj 4809: 皇后【dfs】

    爆搜卡线过 并不知道正解是啥 #include<iostream> #include<cstdio> using namespace std; const int N=40; ...