文档章节

java序列化(六) - protostuff序列化

晨猫
 晨猫
发布于 2018/10/22 19:58
字数 455
阅读 26
收藏 0

添加依赖

        <dependency>
            <groupId>io.protostuff</groupId>
            <artifactId>protostuff-core</artifactId>
            <version>1.5.9</version>
        </dependency>

        <dependency>
            <groupId>io.protostuff</groupId>
            <artifactId>protostuff-runtime</artifactId>
            <version>1.5.9</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

编写序列化工具类

package meng.springboot.demo.obj;

import io.protostuff.LinkedBuffer;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * XXX
 *
 * @author mengzhang6
 * @date 2018/10/22 19:18
 */
public class ProtostuffUtils {

    private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<>();

    private static <T> Schema<T> getSchema(Class<T> cls) {
        Schema<T> schema = (Schema<T>) cachedSchema.get(cls);
        if (schema == null) {
            schema = RuntimeSchema.createFrom(cls);
            if (schema != null) {
                cachedSchema.put(cls, schema);
            }
        }
        return schema;
    }

    /**
     * 序列化
     *
     * @param obj
     * @param <T>
     * @return
     */
    public static <T> byte[] serialize(T obj) {
        Class<T> cls = (Class<T>) obj.getClass();
        LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
        try {
            Schema<T> schema = getSchema(cls);
            return ProtostuffIOUtil.toByteArray(obj, schema, buffer);
        } catch (Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        } finally {
            buffer.clear();
        }
    }

    /**
     * 反序列化
     *
     * @param data
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> T deserialize(byte[] data, Class<T> cls) {
        try {
            Schema<T> schema = getSchema(cls);
            T message = schema.newMessage();
            ProtostuffIOUtil.mergeFrom(data, message, schema);
            return message;
        } catch (Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        }
    }


}

实体类

package meng.springboot.demo.obj;

import java.util.Date;

/**
 * XXX
 *
 * @author mengzhang6
 * @date 2018/10/22 19:36
 */
public class User4 {
    private int id;
    private String name;
    private Date addDate;

    /**
     * 使用transient表示,不参与序列化
     */
    private transient String no;

    /**
     * 声明为static和transient类型的成员数据不能被序列化
     * 因为static代表类的状态,transient代表对象的临时数据。
     */
    public static String staNo;

    /**
     * Archive也需要实现Serializable
     */
    private Archive archive;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getAddDate() {
        return addDate;
    }

    public void setAddDate(Date addDate) {
        this.addDate = addDate;
    }


    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public Archive getArchive() {
        return archive;
    }

    public void setArchive(Archive archive) {
        this.archive = archive;
    }


    @Override
    public String toString() {
        return "User4{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", addDate=" + addDate +
                ", no='" + no + '\'' +
                ", archive=" + archive +
                '}';
    }
}

单元测试

    @Test
    public void writeObject4() throws IOException {
        User4 user = new User4();
        user.setId(1004);
        user.setName("晨猫");
        user.setAddDate(Calendar.getInstance().getTime());
        user.setNo("Xs01");
        user.setArchive(new Archive("Mc001", "Hangzhou", "18366557620"));
        System.out.println(user);

        byte[] data = ProtostuffUtils.serialize(user);
        FileUtils.writeByteArrayToFile(new File("User4.out"), data);
    }

    @Test
    public void readObject4() throws IOException, ClassNotFoundException {
        User4 user = ProtostuffUtils.deserialize(FileUtils.readFileToByteArray(new File("User4.out")), User4.class);
        System.out.println(user);
    }

© 著作权归作者所有

共有 人打赏支持
晨猫
粉丝 35
博文 424
码字总数 135159
作品 0
杭州
后端工程师
私信 提问
序列化框架比较:kryo & hessian & Protostuff & java

序列化框架性能对比(kryo、hessian、java、protostuff) 简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf ...

鉴客
2013/03/04
11K
0
各种 Java 的序列化库的性能比较测试结果

免责声明 本次测试专注于 cyclefree 数据结构的编码和解码。一些序列化程序支持循环检测/对象共享,一些序列化程序两种模型都支持,一些序列化程序包括了元数据,一些则没有,有的是跨平台的...

孔小菜
2015/06/02
6.2K
4
网络传输数据序列化工具Protostuff

一直在物色比较好用的网络传输数据序列化工具,看了诸如marshalling,protobuff等,但是均有一个共同特点,使用起来异常繁杂,有没有比较好用同时性能又不会太差的组件呢?答案当然是有的,那...

java菜分享
01/02
0
0
protostuff序列化java对象时竟然比java原生序列化还占内存

今天测试序列化对象的时候循环10000次下列对象 protostuff报错 而java的序列化不但没报错而且速度一直比proto快 下面是实体类,和具体序列化方法

Mr_SWang
2016/12/14
801
3
spring-boot-starter-grpc 实现原理

RPC 流程 1、服务调用方(Client)将远程方法的信息(如类名、方法方法名、方法传入的参数)封装为统一的请求体; 2、序列化请求对象,转化为二进制串,方便传输; 3、通过 Client Stub 发送...

Anoyi
2018/05/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 舔狗是没有好下场的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听什么# #今天听这个# 分享 Nirvana 的歌曲《Smells Like Teen Spi...》 《Smells Like Teen Spi...》- Nirvana 手机党少...

小小编辑
57分钟前
11
4
Linux Wireshark普通用户启动使用方案

当系统安装好Wireshark后请正常启动是否可以进行正常使用,如果不行请参考下列指导 向系统添加一个用户组 sudo groupadd wireshark //如提示此组存在可跳过 将指定用户添加到这个组中 sudo...

CHONGCHEN
今天
2
0
CSS 选择器参考手册

CSS 选择器参考手册 选择器 描述 [attribute] 用于选取带有指定属性的元素。 [attribute=value] 用于选取带有指定属性和值的元素。 [attribute~=value] 用于选取属性值中包含指定词汇的元素。...

Jack088
今天
2
0
数据库篇一

数据库篇 第1章 数据库介绍 1.1 数据库概述  什么是数据库(DB:DataBase) 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据...

stars永恒
今天
5
0
Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部