Protostuff使用示例

Posted chszs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Protostuff使用示例相关的知识,希望对你有一定的参考价值。

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是一个缓冲区类,它封装了字节数组并具有对下一个缓冲区的引用以便能动态增加容量。

执行程序,输出如下:

UserfirstName=’zhang’, lastName=’sanfeng’, email=’10000@qq.com’, friends=[UserfirstName=’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]]

UserfirstName=’zhang’, lastName=’sanfeng’, email=’10000@qq.com’, friends=[UserfirstName=’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);
        
    

以上是关于Protostuff使用示例的主要内容,如果未能解决你的问题,请参考以下文章

基于protostuff的序列化工具类开发

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

protostuff序列化/反序列化

Protostuff序列化和反序列化的简单使用

Protostuff序列化问题

protostuff序列化接口封装