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. MongDB应用

    题外话 工作3年,了解的技术颇多,但都是一知半解,了解不是很透澈.用过的技术,就像猴子搬过的包谷,搬一个丢一个.几年风雨,真有点一缕清风过,片叶不沾身的味道. 为强化知识点,提升文档及学习能力,我把以 ...

  2. JavaScript基础 -- 定时器

     js 定时器有以下两个方法: setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式.方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭. set ...

  3. curl HTTP_USER_AGENT

    [root@bigdata-server-01 ~]# curl 13.26.92.20array(27) { ["HTTP_USER_AGENT"]=> string(11 ...

  4. PSAM卡之常用APDU指令错误码【转】

    本文转载自:http://blog.csdn.net/lvxiangan/article/details/53933714 PSAM卡的内容交互,是通过APDU指令完成的,常见的APDU报文格式如下: ...

  5. [翻译]NUnit---Exception && Utility Methods (六)

    网址:http://www.cnblogs.com/kim01/archive/2013/04/01/2994378.html Exception Asserts (NUnit 2.5) Assert ...

  6. CMake使用总结

    总结CMake的常用命令,并介绍有用的CMake资源. CMake意为cross-platform make,可用于管理c/c++工程.CMake解析配置文件CMakeLists.txt生成Makef ...

  7. bzoj 1791: [Ioi2008]Island 岛屿【基环树+单调队列优化dp】

    我太菜了居然调了一上午-- 这个题就是要求基环树森林的基环树直径和 大概步骤就是找环->dp找每个环点最远能到达距离作为点权->复制一倍环,单调队列dp 找环是可以拓扑的,但是利用性质有更 ...

  8. P3256 [JLOI2013]赛车

    传送门 如果把速度看成斜率,起始位置看成截距,这就是一个水平可见直线了-- 不过这题里我实现方法借鉴了CQzhangyu大佬的,先按速度排序,然后维护一个单调栈,如果当前的人速度比栈顶大距离又比它远直 ...

  9. JS中定时器的返回数值ID值

    定时器会返回一个数字值id,可以由clearInterval(id)或clearTimeout(id)来实现对对应定时器的清除. setInterval()/setTimeout()BOM中的Wind ...

  10. FFT学习及简单应用(一点点详细)

    什么是FFT 既然打开了这篇博客,大家肯定都已经对FFT(Fast Fourier Transformation)有一点点了解了吧 FFT即为快速傅里叶变换,可以快速求卷积(当然不止这一些应用,但是我 ...