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. AVD那些事儿

    启动了AVD却说找不到AVD 错误提示: No active compatible AVD's or devices found. Relaunch this configuration after ...

  2. Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决

    Delphi中WebBrowser控件打开部分网站报"Invalid floating point operation”解决 EmbeddedWBWebBrowserDelphi  最近用E ...

  3. YTU 2640: 编程题:运算符重载---矩阵求和

    2640: 编程题:运算符重载---矩阵求和 时间限制: 1 Sec  内存限制: 128 MB 提交: 484  解决: 190 题目描述 /* 有两个矩阵a和b,均为2行3列.求两个矩阵之和. 重 ...

  4. SPI操作flash MX25L64读写数据

    STM32F10X SPI操作flash MX25L64读写数据 简单的一种应用,ARM芯片作为master,flash为slaver,实现单对单通信.ARM主控芯片STM32F103,flash芯片 ...

  5. 杂项-Java:Tomcat

    ylbtech-杂项-Java:Tomcat 1.返回顶部 1. Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目, ...

  6. bzoj 1603: [Usaco2008 Oct]打谷机【瞎搞】

    一棵树,碰到改变转向的边就异或一下,从1dfs一遍 #include<iostream> #include<cstdio> using namespace std; const ...

  7. 使用particles.js实现网页背景粒子特效

    得知途径 B3log提供了两套博客系统,一个是用Java开发的,叫做Solo,我也是在网上搜索Java博客系统时发现了它,之后才了解了B3log:还有一个是用Go语言开发的,叫做Pipe.其中Solo ...

  8. CSS3常用知识点

    CSS3常用知识点 1 css3选择器 1.1 属性选择器 /* E[attr~=val] 表示的一个单独的属性值 这个属性值是以空格分隔的*/ .attr2 a[class~="kawa& ...

  9. 个人作品:EasyPicker(轻取)简洁而又实用的文件收取Web应用

    EasyPicker简洁实用且方便的在线文件收取Web应用  小弟我作为班上的学委,有一个伟大的职责,收发各科作业(尤其是专业课的上机课),上机==写报告,此时就产生了实验报告这个玩意儿,一个班少则4 ...

  10. 键盘按钮keyCode大全:获取按键对应的键值的方法

    没有大全,只有方法,授人与鱼不如授人于渔: 下面这行代码,大家可以打在控制台里,直接进行测试: document.body.onkeyup = function (e) { e = e || wind ...