Protostuff开发

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50460047 Protostuff开发作者:chszs,未经博主允许不得转载。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50460047

Protostuff开发

作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs

五、Protostuff用法

1、为Java实体产生schemas

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

2、Runtime schemas

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

3、Protostuff的Maven插件

Protostuff的Maven插件可以从.proto文件中生成Java源码或其它语言的源码——通过使用基于StringTemplate的代码生成器(或扩展)。
下面讲述此插件的用法。

1)项目的结构如下:

<project root>
├───pom.xml
└───src
    └───main
        └───proto
            └───hello.proto

Protocol buffer定义路径是可配置的,但是推荐使用src/main/proto/路径。所有的.proto文件及其子目录都放于此目录下,且会被protobuf定义视为包结构,以import方式导入。

hello.proto的内容如下:

package search;

option java_package = "stuff.ch";

message HelloRequest {
    optional string name = 1;
}

message HelloResponse {
    optional string greeting = 1;
}

service HelloService {
    rpc hello (HelloRequest) returns (HelloResponse);
}

执行命令:

mvn protostuff:compile

在项目目录下产生相应的Java文件。

<project root>
├───pom.xml
└───target
    └───generated-sources
        └───proto
            └───stuff
                └───ch
                    └───HelloRequest.java
                    └───HelloResponse.java

HelloRequest.java的内容如下:

// Generated by http://code.google.com/p/protostuff/ ... DO NOT EDIT!
// Generated from proto

package stuff.ch;

import javax.annotation.Generated;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Objects;

import io.protostuff.GraphIOUtil;
import io.protostuff.Input;
import io.protostuff.Message;
import io.protostuff.Output;
import io.protostuff.Schema;

@Generated("java_bean")
public final class HelloRequest implements Externalizable, Message<HelloRequest>, Schema<HelloRequest> {

    public static Schema<HelloRequest> getSchema() {
        return DEFAULT_INSTANCE;
    }

    public static HelloRequest getDefaultInstance() {
        return DEFAULT_INSTANCE;
    }

    static final HelloRequest DEFAULT_INSTANCE = new HelloRequest();

    private String name;

    public HelloRequest() {

    }

    // getters and setters

    // name

    public String getName() {
        return name;
    }

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || this.getClass() != obj.getClass()) {
            return false;
        }
        final HelloRequest that = (HelloRequest) obj;
        return Objects.equals(this.name, that.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

    @Override
    public String toString() {
        return "HelloRequest{" + "name=" + name + '}';
    }
    // java serialization

    public void readExternal(ObjectInput in) throws IOException {
        GraphIOUtil.mergeDelimitedFrom(in, this, this);
    }

    public void writeExternal(ObjectOutput out) throws IOException {
        GraphIOUtil.writeDelimitedTo(out, this, this);
    }

    // message method

    public Schema<HelloRequest> cachedSchema() {
        return DEFAULT_INSTANCE;
    }

    // schema methods

    public HelloRequest newMessage() {
        return new HelloRequest();
    }

    public Class<HelloRequest> typeClass() {
        return HelloRequest.class;
    }

    public String messageName() {
        return HelloRequest.class.getSimpleName();
    }

    public String messageFullName() {
        return HelloRequest.class.getName();
    }

    public boolean isInitialized(HelloRequest message) {
        return true;
    }

    public void mergeFrom(Input input, HelloRequest message) throws IOException {
        for (int number = input.readFieldNumber(this);; number = input.readFieldNumber(this)) {
            switch (number) {
            case 0:
                return;
            case 1:
                message.name = input.readString();
                break;
            default:
                input.handleUnknownField(number, this);
            }
        }
    }

    public void writeTo(Output output, HelloRequest message) throws IOException {
        if (message.name != null)
            output.writeString(1, message.name, false);
    }

    public String getFieldName(int number) {
        return Integer.toString(number);
    }

    public int getFieldNumber(String name) {
        return Integer.parseInt(name);
    }

}

HelloResponse.java的内容如下:

// Generated by http://code.google.com/p/protostuff/ ... DO NOT EDIT!
// Generated from proto

package stuff.ch;

import javax.annotation.Generated;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Objects;

import io.protostuff.GraphIOUtil;
import io.protostuff.Input;
import io.protostuff.Message;
import io.protostuff.Output;
import io.protostuff.Schema;

@Generated("java_bean")
public final class HelloResponse implements Externalizable, Message<HelloResponse>, Schema<HelloResponse> {

    public static Schema<HelloResponse> getSchema() {
        return DEFAULT_INSTANCE;
    }

    public static HelloResponse getDefaultInstance() {
        return DEFAULT_INSTANCE;
    }

    static final HelloResponse DEFAULT_INSTANCE = new HelloResponse();

    private String greeting;

    public HelloResponse() {

    }

    // getters and setters

    // greeting

    public String getGreeting() {
        return greeting;
    }

    public void setGreeting(String greeting) {
        this.greeting = greeting;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || this.getClass() != obj.getClass()) {
            return false;
        }
        final HelloResponse that = (HelloResponse) obj;
        return Objects.equals(this.greeting, that.greeting);
    }

    @Override
    public int hashCode() {
        return Objects.hash(greeting);
    }

    @Override
    public String toString() {
        return "HelloResponse{" + "greeting=" + greeting + '}';
    }
    // java serialization

    public void readExternal(ObjectInput in) throws IOException {
        GraphIOUtil.mergeDelimitedFrom(in, this, this);
    }

    public void writeExternal(ObjectOutput out) throws IOException {
        GraphIOUtil.writeDelimitedTo(out, this, this);
    }

    // message method

    public Schema<HelloResponse> cachedSchema() {
        return DEFAULT_INSTANCE;
    }

    // schema methods

    public HelloResponse newMessage() {
        return new HelloResponse();
    }

    public Class<HelloResponse> typeClass() {
        return HelloResponse.class;
    }

    public String messageName() {
        return HelloResponse.class.getSimpleName();
    }

    public String messageFullName() {
        return HelloResponse.class.getName();
    }

    public boolean isInitialized(HelloResponse message) {
        return true;
    }

    public void mergeFrom(Input input, HelloResponse message) throws IOException {
        for (int number = input.readFieldNumber(this);; number = input.readFieldNumber(this)) {
            switch (number) {
            case 0:
                return;
            case 1:
                message.greeting = input.readString();
                break;
            default:
                input.handleUnknownField(number, this);
            }
        }
    }

    public void writeTo(Output output, HelloResponse message) throws IOException {
        if (message.greeting != null)
            output.writeString(1, message.greeting, false);
    }

    public String getFieldName(int number) {
        return Integer.toString(number);
    }

    public int getFieldNumber(String name) {
        return Integer.parseInt(name);
    }

}

编写HelloService.java,内容如下:

package stuff.ch;

import io.protostuff.LinkedBuffer;
import io.protostuff.ProtobufIOUtil;
import io.protostuff.Schema;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class HelloService {
    public static final Schema<HelloRequest> SEARCH_REQUEST_SCHEMA = HelloRequest.getSchema();
    public static final Schema<HelloResponse> SEARCH_RESPONSE_SCHEMA = HelloResponse.getSchema();

    /**
     * Sample "hello" rpc method handler.
     *
     * @param requestData
     *            {@code HelloRequest} binary array encoded using Protocol
     *            Buffers
     * @return {@code HelloResponse} binary array encoded using Protocol Buffers
     */
    public byte[] hello(byte[] requestData) throws IOException {
        HelloRequest request = deserialize(requestData);
        HelloResponse response = hello(request);
        return serialize(response);
    }

    private byte[] serialize(HelloResponse response) throws IOException {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        LinkedBuffer buffer = LinkedBuffer.allocate();
        ProtobufIOUtil.writeTo(outputStream, response, SEARCH_RESPONSE_SCHEMA, buffer);
        return outputStream.toByteArray();
    }

    private HelloRequest deserialize(byte[] requestData) {
        HelloRequest request = SEARCH_REQUEST_SCHEMA.newMessage();
        ProtobufIOUtil.mergeFrom(requestData, request, SEARCH_REQUEST_SCHEMA);
        return request;
    }

    /**
     * Service method implementation.
     */
    private HelloResponse hello(HelloRequest request) {
        HelloResponse response = new HelloResponse();
        String name = request.getName();
        response.setGreeting("Hello, " + name);
        return response;
    }
}

编写单元测试类HelloServiceTest.java,内容如下:

package stuff.ch;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class HelloServiceTest {
    public static final byte[] REQUEST = new byte[] { 0x0A, 0x03, '4', '2', '!' };
    public static final byte[] RESPONSE = new byte[] { 0x0A, 0x0A, 'H', 'e', 'l', 'l', 'o', ',', ' ', '4', '2', '!' };

    private HelloService service;

    @Before
    public void setUp() throws Exception {
        service = new HelloService();
    }

    @Test
    public void testSearch() throws Exception {
        byte[] responseData = service.hello(REQUEST);
        Assert.assertArrayEquals(RESPONSE, responseData);
    }
}

运行单元测试,测试通过。

目录
相关文章
|
7月前
|
JSON 安全 Java
jackson学习之二:jackson-core
了解jackson最底层的功能逻辑
117 0
jackson学习之二:jackson-core
|
7天前
|
Java 数据库连接 Apache
Hutool工具包等常用工具类总结
Hutool工具包等常用工具类总结
|
4月前
hutool动态编译+lombok
hutool动态编译+lombok
33 1
|
10月前
|
JSON 前端开发 Java
【工作中问题解决实践 七】SpringBoot集成Jackson进行对象序列化和反序列化
【工作中问题解决实践 七】SpringBoot集成Jackson进行对象序列化和反序列化
257 0
|
编解码
Netty(六)之protostuff
Netty(六)之protostuff
136 0
Netty(六)之protostuff
|
消息中间件 NoSQL 安全
【Spring技术原理】采用protostuff和kryo高性能序列化框架实现RestTemplate的序列化组件
【Spring技术原理】采用protostuff和kryo高性能序列化框架实现RestTemplate的序列化组件
230 0
【Spring技术原理】采用protostuff和kryo高性能序列化框架实现RestTemplate的序列化组件
|
缓存 Java Maven
java序列化机制之protoStuff
之前曾经写了两篇java的序列的机制,一种是默认的java序列化机制,这种方式效率太低。另外一种是谷歌的protobuf,但是这种我们还要写proto文件,并且我们还要使用工具来编译生成java文件,实在太麻烦。但是protostuff却不一样,能够很好的解决上面两者的问题。这篇文章就研究一下如何去使用,并对其进行一个简单的分析。
415 0
|
Java easyexcel Maven
java EasyExcel集成及工具类使用
EasyExcel简介 easyExcel是阿里巴巴开源poi插件之一,当前最新版本1.1.2-beta5,poi版本3.17,因此,集成时老版本poi需要提升poi版本,或者做版本隔离。 吐槽一下这个版本没有RELEASE版本 主要解决了poi框架使用复杂,sax解析模式不容易操作,数据量大起来容易OOM,解决了POI并发造成的报错 主要解决方式:通过解压文件的方式加载,一行一行的加载,并且抛弃样式字体等不重要的数据,降低内存的占用 具体实现原理,建议看github上的readme EasyExcel优势 注解式自定义操作。
33787 0
|
Java Maven
Protostuff使用示例
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/80354356 Protostuff使用示例 2018.5.17 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。
1411 0