文档章节

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

晨猫
 晨猫
发布于 10/22 19:58
字数 455
阅读 12
收藏 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);
    }

© 著作权归作者所有

共有 人打赏支持
晨猫
粉丝 32
博文 385
码字总数 107901
作品 0
杭州
后端工程师
私信 提问
spring-boot-starter-grpc 实现原理

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

Anoyi
05/20
0
0
BigMemroy系列文章--8. Bigmemory快速接入实战

转载请注明出处哈:http://carlosfu.iteye.com/blog/2237511 更多BigMemory Go可参考官方文档: 一、BigMemory证书: (1). 由于BigMemory是商业版,需要从官网上注册、下载证书(目前只支持9...

付磊-起扬
2015/08/27
0
0
180918-JDK之Deflater压缩与Inflater解压

JDK 压缩与解压工具类 在实际的应用场景中,特别是对外传输数据时,将原始数据压缩之后丢出去,可以说是非常常见的一个case了,平常倒是没有直接使用JDK原生的压缩工具类,使用Protosutff和K...

小灰灰Blog
09/18
0
0
Android Serializable与Parcelable原理与区别

一、序列化、反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。 对象的反序列化:把字节序列恢复为Java对象的过程。 (2) 序列化详细解释 ...

KingMing
2015/04/16
0
0
Java序列化与JSON序列化大比拼

一、背景 有项目需要传输Map结构的数据,有人倾向用Java序列化来做,有人倾向用JSON的序列化来做。所以我们还是比比吧。 Java观点:Object2Object,使用时简单快速。 JSON观点:JSON格式与语...

NoahX
2013/03/10
0
20

没有更多内容

加载失败,请刷新页面

加载更多

图形用户界面和交互输入方法---图形数据的输入功能

图形数据的输入功能 输入模式 回显反馈

中国龙-扬科
8分钟前
0
0
互联网企业安全之端口监控

背景 外网端口监控系统是整个安全体系中非常重要的一环,它就像眼睛一样,时刻监控外网端口开放情况,并且在发现高危端口时能够及时提醒安全、运维人员做出相应处理。 对安全人员来说,互联网...

Skqing
10分钟前
0
0
JavaMonitor

常规监控jvm,都是比较麻烦的。但是今天在开源中国,看到了一个web版的javaMonitor。 虽然要在服务器上安装,但是这样的话,大家都能看见了。所以还是非常six的。 发现写了这个的博主也是非常...

miaojiangmin
14分钟前
0
0
Redis实践系列丨Codis数据迁移原理与优化

Codis介绍 Codis 是一种Redis集群的实现方案,与Redis社区的Redis cluster类似,基于slot的分片机制构建一个更大的Redis节点集群,对于连接到codis的Redis客户端来说, 除了部分不支持的命令外...

中间件小哥
14分钟前
0
0
HTTP常用状态码(14种)

类别 原因短语 1xx 信息型状态码 接收的请求正在处理 2xx 成功状态码 请求正常处理完毕 3xx 重定向状态码 需要进行附加操作以完成请求 4xx 客户端错误状态码 服务器无法处理请求 5xx 服务器错...

vio小黑
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部