Protostuff序列化和反序列化使用说明

Protostuff序列化和反序列化使用说明google原生的protobuffer使用起来相当麻烦,首先要写.proto文件,然后编译.proto文件,生成对应的.java文件,鄙人试了一次,发现真的很麻烦。而protostuff的官方网站(http://www.protostuff.io/documentation/runtime-schema/),对于智商比较低的小编来说也略显生涩,于是鄙人就根据项目中用到的protostuff,撰写此文,以方便自己和他人加深印象和学习。

大家好,又见面了,我是你们的朋友全栈君。

google原生的protobuffer使用起来相当麻烦,首先要写.proto文件,然后编译.proto文件,生成对应的.java文件,鄙人试了一次,发现真的很麻烦。而protostuff的官方网站(http://www.protostuff.io/documentation/runtime-schema/),对于智商比较低的小编来说也略显生涩,于是鄙人就根据项目中用到的protostuff,撰写此文,以方便自己和他人加深印象和学习。

1.实战

1.maven依赖:

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

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

2.ProtoBufUtil工具类:ProtoBufUtil.java
import io.protostuff.LinkedBuffer;
import io.protostuff.ProtobufIOUtil;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;

/**
 * Created by zhangzh on 2017/2/20.
 */
public class ProtoBufUtil {
    public ProtoBufUtil() {
    }

    public static <T> byte[] serializer(T o) {
        Schema schema = RuntimeSchema.getSchema(o.getClass());
        return ProtobufIOUtil.toByteArray(o, schema, LinkedBuffer.allocate(256));
    }

    public static <T> T deserializer(byte[] bytes, Class<T> clazz) {

        T obj = null;
        try {
            obj = clazz.newInstance();
            Schema schema = RuntimeSchema.getSchema(obj.getClass());
            ProtostuffIOUtil.mergeFrom(bytes, obj, schema);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return obj;
    }
}

  3. bean类Student.java:    
import io.protostuff.Tag;

/**
 * Created by zhangzh on 2017/2/20.
 */
public class Student {

    @Tag(1)
    private String name;
    @Tag(2)
    private String studentNo;
    @Tag(3)
    private int age;
    @Tag(4)
    private String schoolName;

   // 关于@Tag,要么所有属性都有@Tag注解,要么都没有,不能一个类中只有部分属性有@Tag注解

    public String getName() {
        return name;
    }

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

    public String getStudentNo() {
        return studentNo;
    }

    public void setStudentNo(String studentNo) {
        this.studentNo = studentNo;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSchoolName() {
        return schoolName;
    }

    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", studentNo='" + studentNo + '\'' +
                ", age=" + age +
                ", schoolName='" + schoolName + '\'' +
                '}';
    }
}

3.test类ProtoBufUtilTest.java:  
import java.util.Arrays;

/**
 * Created by zhangzh on 2017/2/20.
 */
public class ProtoBufUtilTest {

    public static void main(String[] args) {

        Student student = new Student();
        student.setName("lance");
        student.setAge(28);
        student.setStudentNo("2011070122");
        student.setSchoolName("BJUT");

        byte[] serializerResult = ProtoBufUtil.serializer(student);

        System.out.println("serializer result:" + Arrays.toString(serializerResult));

        Student deSerializerResult = ProtoBufUtil.deserializer(serializerResult,Student.class);

        System.out.println("deSerializerResult:" + deSerializerResult.toString());
    }

}

4.输出结果:  

serializer result:[10, 5, 108, 97, 110, 99, 101, 18, 10, 50, 48, 49, 49, 48, 55, 48, 49, 50, 50, 24, 28, 34, 4, 66, 74, 85, 84]
deSerializerResult:Student{name='lance', studentNo='2011070122', age=28, schoolName='BJUT'}

看,简单吧!

 参考资料:1. protostuff官方网站.

                     2. Protostuff序列化.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149567.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • js正则表达式匹配ip地址(ip地址正则表达式验证)

    letreg=/https:\/\/.*\.[0-9]{1,4}(:[\w]+)?/g这个正则匹配的结果如下https://101.122.134.40:8860/aa.bb/aa/ee>https://10.162.123.40:8860https://101.122.134.40/aa.bb/aa/ee>https://101.122.134.40然后替换一下即可letstr=’https://101.122.134.40:8860/aa.bb/aa/ee

  • win10中修改mac地址(总有一款适合你)

    win10中修改mac地址(总有一款适合你)我的解决办法如下:先上图:下面转自:Win10秘笈:两种方式修改网卡物理地址(MAC)https://www.ithome.com/html/win10/244510.htm在修改之前,可以先确定一下要修改的网卡MAC地址,查询方法有很多种,比如:1、在设置→网络和Internet→WLAN/以太网,如下图——2、在控制

  • jieba库详解「建议收藏」

    jieba库详解「建议收藏」jieba是优秀的中文分词第三方库中文文本需要通过分词获得单个的词语jieba是优秀的中文分词第三方库,需要额外安装jieba库提供三种分词模式,最简单只需安装一个函数。jieba库是通过中文词库的方式来识别分词的。安装命令如下:点击windows+r,进入命令提示符输入cmd,进入界面后,输入pipinstalljieba。即可安装,示例如下:安装界面如下:jieba库分词依靠中文词库利用一个中文词库,确定汉字之间的关联概念汉字间概率大的组成词组,形成.

  • pycharm设置成中文_苹果怎么设置语言为中文

    pycharm设置成中文_苹果怎么设置语言为中文Pycharm设置为中文我的Pycharm版本,2021.021.双击打开Pycharm2.选择file,然后选择settings3.根据操作,选择中文语言包,然后点击install安装4.等待安装完成后,进行设置5.重启之后发现页面变成中文…

  • WinForm拖动没有标题栏窗体的方法

    建立窗体的名称修改为:Form_HoverTree文后附有源码下载。主要代码:效果图:可以看出,这个窗体为自定义形状的窗体,没有标题栏。具体参考:http://hovertree.com/h/bj

    2021年12月28日
  • deeplink

    deeplinkhttp://www.cnblogs.com/shadajin/p/5724117.htmlDeeplink,简单讲,就是你在手机上点击一个链接之后,可以直接链接到app内部的某个页面,而不是app正常打开时显示的首页。不似web,一个链接就可以直接打开web的内页,app的内页打开,必须用到deeplink技术。什么是deeplink技术?如何实现的?郭宇洋的这篇文章有非常轻松易懂的说…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号