Protostuff开发

Protostuff开发Protostuff开发作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs五、Protostuff用法1、为Java实体产生schemasio.protostuffprotostuff-core<

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

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);
    }
}

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

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

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

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


相关推荐

  • STM32 + UCOSII 操作系统(简单讲解)「建议收藏」

    STM32 + UCOSII 操作系统(简单讲解)「建议收藏」前言这是我将UCOSII操作系统移植在STM32单片机上后进行UCOSII操作系统学习的一些笔记与理解,此文最后会附上我自己在UCOSII操作系统下使用STM32写的ESP8266+onenet+http协议的程序链接,可以作为参考,如果文中有不当的地方,还请各位大佬加以中指正,我一定会虚心求教。参考资料:正点原子RTOS操作系统讲解,参考的文章:(53条消息)STM32学习笔记一一UCOSII(1)_霁风AI-CSDN博客_ucosii1.UCOSII操作系统的简介前台后台系统相信大家都

    2022年6月4日
    33
  • OleDbCommand类[通俗易懂]

    OleDbCommand类[通俗易懂]首先,建立一个OleDbCmdTest.aspx代码如下:&amp;lt;%@PageLanguage=&quot;C#&quot;AutoEventWireup=&quot;true&quot;CodeFile=&quot;OleDbCmdTest.aspx.cs&quot;Inherits=&quot;OleDbCmdTest&quot;%&amp;gt;&amp;lt;!DOCTYPE

    2022年5月20日
    40
  • intellijidea激活码_通用破解码

    intellijidea激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    84
  • Apache配置虚拟主机_apache启动但是访问不到

    Apache配置虚拟主机_apache启动但是访问不到Apache配置虚拟主机无效本今天电脑重新安装了一下apache,结果配置好虚拟域名之后,却一直无法访问;localhost一直是显示itworks状态;配置好了虚拟域名之后,输入任何配置的域名也都是显示itworks状态;而通过127.0.0.1是可以看到文件目录的;经过再三检查,最后发现问题是在httpd_conf文件上,只需要注释掉ServerNamelocalhos

    2022年9月18日
    0
  • Hmily 源码解析(二)—— Hmily事务工作流程「建议收藏」

    Hmily 源码解析(二)—— Hmily事务工作流程「建议收藏」Hmily源码解析(二)前言这一篇不想谈论Hmily源码的技术实现,而是想在过了一遍hmily的实现后把hmily的工作思路单独地整理出来再进行一次总结。看看能不能进一步有所得。以hmily-demo-springcloud为例,它的实现思路如下。Hmily事务工作流程首先它是基于切面编程来实现分布式事务的操作,及通过日志记录TCC事务的信息以保证最终一致性。前…

    2022年5月11日
    29
  • IDEA激活成功教程后一直提示JetbrainsAgent 相关的弹框问题

    IDEA激活成功教程后一直提示JetbrainsAgent 相关的弹框问题激活成功教程后打开IDEA就弹框,关闭之后会自动打开浏览器,隔一会也会弹出来 也是一样的问题一开始是说把txt 和 jar 文件放一个路径下之类的方法,几经波折,发现没任何用处~最后各种搜索排查,在设置下更改配置就不弹啦~settings设置下搜索agent 取消”Instrumenting agent(requires debugger restart)”在 Reload classes after compilation:选择第一个 Always…

    2022年8月19日
    9

发表回复

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

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