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

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

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

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

(0)


相关推荐

  • JAVA基础:二维数组初始化

    JAVA基础:二维数组初始化二维数组的初始化同一维数组初始化类似,同样可以使用”{}”大括号完成二维数组的初始化,不同的是每个一维数组的元素使用大括号定义新的一维数组,即一维数组的每个元素又是一个新的一维数组。定义一个二维数组:把二维数组所有的赋同一个初始化值arrayType[][]arrayName=new arrayTyp[n][m];for(inti=0;iarrayName.l

  • thinkphp 清理runtime缓存的方法, 清理指定目录

    thinkphp 清理runtime缓存的方法, 清理指定目录

    2021年10月26日
  • Nginx(三):负载均衡策略 与 Nginx静态服务器

    Nginx(三):负载均衡策略 与 Nginx静态服务器

  • 详解 ManualResetEvent

    详解 ManualResetEvent今天详细说一下ManualResetEvent它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源当一个线程开始一个活动(此活动必须完成后,其他线程才能

  • android 混淆规则作用,Android代码混淆详解

    android 混淆规则作用,Android代码混淆详解一、混淆的意义混淆代码并不是让代码无法被反编译,而是将代码中的类、方法、变量等信息进行重命名,把它们改成一些毫无意义的名字,同时也可以移除未被使用的类、方法、变量等。所以直观的看,通过混淆可以提高程序的安全性,增加逆向工程的难度,同时也有效缩减了apk的体积。总结如下:1、将项目中的类、方法、变量等信息进行重命名,变成一些无意义的简短名字。2、移除未被使用的类、方法、变量等。二、混淆的规则和配置…

  • PAT乙级1013

    PAT乙级1013实现#include&lt;iostream&gt;#include&lt;cmath&gt;usingnamespacestd;boolisPrime(intnum){ inti; for(i=2;i&lt;=sqrt(num);i++) { if(num%i==0) returnfalse; } returntrue;…

发表回复

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

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