Protostuff使用示例

Protostuff使用示例Protostuff使用示例1、引入Maven依赖的JAR包<dependency><groupId>io.protostuff</groupId><artifactId>protostuff-core</artifactId>

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

Protostuff使用示例

  • 2018.5.17
  • 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

1、引入Maven依赖的JAR包

    <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>io.protostuff</groupId>
        <artifactId>protostuff-api</artifactId>
        <version>1.5.9</version>
    </dependency>

2、编写需要被序列化的实体类

这里是User.java(成员属性包含了其它类)

package demo.protostuff;

import java.util.List;

public class User {
    private String firstName;
    private String lastName;
    private String email;
    private List<User> friends;
    private List<Car> cars;

    public User() {

    }

    public User(String email) {
        this.email = email;
    }

    // getters and setters

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public List<User> getFriends() {
        return friends;
    }

    public void setFriends(List<User> friends) {
        this.friends = friends;
    }

    public List<Car> getCars() {
        return cars;
    }

    public void setCars(List<Car> cars) {
        this.cars = cars;
    }

    @Override
    public String toString() {
        return "User{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", email='" + email
                + '\'' + ", friends=" + friends + ", cars=" + cars + '}';
    }
}

Car.java

package demo.protostuff;

public class Car {
    private String color;
    private String car_name;
    private Integer price;

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getCar_name() {
        return car_name;
    }

    public void setCar_name(String car_name) {
        this.car_name = car_name;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    public Car(String car_name) {
        super();
        this.car_name = car_name;
    }

    public Car() {
        super();
    }

    @Override
    public String toString() {
        return "Car [color=" + color + ", car_name=" + car_name + ", price=" + price + "]";
    }

}

3、主程序类

这里是App.java

package demo.protostuff;

import java.util.ArrayList;
import java.util.List;

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

public class App {
    private static RuntimeSchema<User> schema = RuntimeSchema.createFrom(User.class);

    public static void main(String[] args) {
        User user1 = new User();
        user1.setEmail("10000@qq.com");
        user1.setFirstName("zhang");
        user1.setLastName("sanfeng");
        List<User> users = new ArrayList<>();
        users.add(new User("20000@qq.com"));
        user1.setFriends(users);
        Car car1 = new Car("宾利");
        Car car2 = new Car("法拉利");
        List<Car> cars = new ArrayList<>();
        cars.add(car1);
        cars.add(car2);
        user1.setCars(cars);

        byte[] bytes = ProtostuffIOUtil.toByteArray(user1, schema,
                LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));

        User user2 = schema.newMessage();
        ProtostuffIOUtil.mergeFrom(bytes, user2, schema);
        System.out.println(user2);
        System.out.println();

        // 使用自定义的工具类

        byte[] bytes1 = ProtostuffUtil.serializer(user1);
        User newUser = ProtostuffUtil.deserializer(bytes1, User.class);
        System.out.println(newUser);
    }
}

程序说明:

  • RuntimeSchema类用于在运行时从Java实体对象中生成所需的模式Schema
  • ProtostuffIOUtil是一个工具类,用于对消息或对象进行序列化/反序列化
  • LinkedBuffer是一个缓冲区类,它封装了字节数组并具有对下一个缓冲区的引用以便能动态增加容量。

执行程序,输出如下:

User{firstName=’zhang’, lastName=’sanfeng’, email=’10000@qq.com’, friends=[User{firstName=’null’, lastName=’null’, email=’20000@qq
.com’, friends=null, cars=null}], cars=[Car [color=null, car_name=宾利, price=null], Car [color=null, car_name=法拉利, price=null]]}

User{firstName=’zhang’, lastName=’sanfeng’, email=’10000@qq.com’, friends=[User{firstName=’null’, lastName=’null’, email=’20000@qq
.com’, friends=null, cars=null}], cars=[Car [color=null, car_name=宾利, price=null], Car [color=null, car_name=法拉利, price=null]]}

4、根据Protostuff库自行封装的工具类

这里是ProtostuffUtil.java

package demo.protostuff;

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

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

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

    private static <T> Schema<T> getSchema(Class<T> clazz) {
        @SuppressWarnings("unchecked")
        Schema<T> schema = (Schema<T>) cachedSchema.get(clazz);
        if (schema == null) {
            schema = RuntimeSchema.getSchema(clazz);
            if (schema != null) {
                cachedSchema.put(clazz, schema);
            }
        }
        return schema;
    }

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

    /**
     * 将字节数组数据反序列化
     * @param data 字节数组
     * @param clazz 对象
     * @return
     */
    public static <T> T deserializer(byte[] data, Class<T> clazz) {
        try {
            T obj = clazz.newInstance();
            Schema<T> schema = getSchema(clazz);
            ProtostuffIOUtil.mergeFrom(data, obj, schema);
            return obj;
        } catch (Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        }
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133770.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • ping命令的使用及代码_通过命令查看ping路径

    ping命令的使用及代码_通过命令查看ping路径在这个时代,科技越来越发达,网络已经越来越成为人们不可缺少的一部分。计算机也已经是很多学校的课程了,因为计算机技术是非常有技术性的专业,它其中涉及到很多专业知识,需要通过学习才能掌握。今日小编就为大家介绍一个计算机的命令,它叫做Ping,这边介绍一下它的入门知识,主要是关于ping连接和命令方面的介绍。  1、Ping的基础知识  ping命令相信大家已经再熟悉不过了,但是能把ping的功能发…

    2022年4月19日
  • Pytest(8)parametrize参数化[通俗易懂]

    Pytest(8)parametrize参数化[通俗易懂]前言当某个接口中的一个字段,里面规定的范围为1-5,你5个数字都要单独写一条测试用例,就太麻烦了,这个时候可以使用pytest.mark.parametrize装饰器可以实现测试用例参数化。官方示

    2022年7月28日
  • python常用模块大全_python 常用库

    python常用模块大全_python 常用库mathmath.ceil(a):用来返回≥a的最小整数math.floor(a):用来返回≤a的最大整数round(a[,b])如果没有参数b,只有a,round()作用是四舍五入如果

    2022年8月6日
  • pycharm简单案例代码_python简单代码编写

    pycharm简单案例代码_python简单代码编写由于纠结良久,因为不知道从什么地方开始说起。想了想,还是实用主义,主要是教大家用软件编程,所以pycharm的一些功能介绍什么的,大家后续可以自己摸索。毕竟如果专门讲解pycharm的功能,那这篇帖子就完全将pycharm了,没必要。我们的目标是,先学会基本的语言与python编程。好的,不说废话,进入正题!######################首先,我们使用pycharm编程,就需要先创建…

    2022年8月28日
  • pyquery安装

    pyquery安装pyquery是一个类似jquery的工具,不过它是在服务端进行处理的,不像jquery是在浏览器中进行处理。如果我们要进行网络爬虫,爬取有用的信息,那么它是我至今见到的不二选择。我们当然可以自己爬取网页,然后可以通过正则表达式,选取有用的信息,但这其实要求挺高的。我以前也做过爬虫工具,专门抓取招聘网站的招聘信息,但我发先我以前做的实在是复杂。而我们程序员很重要的一点是,不要重复的发明轮子,我们只

    2022年6月6日
  • Log4j中conversionPattern的含义「建议收藏」

    Log4j中conversionPattern的含义「建议收藏」%a–表示礼拜几,英文缩写形式,比如“Fri”%A–表示礼拜几,比如“Friday”%b–表示几月份,英文缩写形式,比如“Oct”%B–表示几月份,“October”%c–

    2022年7月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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