protobuf的配置原始文件.proto中,使用修饰符repeated、required、optional生成的java文件的区别

最近在做一个基于Netty框架的项目。

该项目使用了Google的Protobuf作为编解码的框架。(没有使用XML或者json是为了更好的提高效率)。

经过了一段时间的使用我对Protobuf的原始文件进行一个简单的使用方法总结。

我主要在这里说明一下,原始文件.proto中,修饰符repeated、required、optional的区别。

0.windows环境,java工程

1.安装protobuf后,找到protoc.exe

2.写一个配置文件进行批处理(.bat),如下图所示

3.写一个proto文件,如:

package trade;

message Testq{
	required string deal_no=1;
	required string client_id=2;
}

(注意:此处之后要进行修饰符repeated、required、optional的区别比较,因此会不断的修改proto文件。)

4.开始进行比较。

4.1使用repeated和不使用repeated的区别。

repeated 就是说该字段是指定类型的数组。在java中是一个list,也就说,在调用的时候可以调用一个list集合,不需要一个一个的调用了,这样做很方便。下面我们来看图,进行详细的说明:

4.1.1配置文件的比较,

下面看看在java中的区别:

首先我们会看待到,在java中增加了public interface TestsOrBuilder的这些代码,然后会看到,java.util.List<trade.Test.Testq> getTestsList();的代码,这段代码说明增加了repeated修饰符之后,生成的java代码为list类型。

然后,我们会在697行找到Testq的代码,因此,增加了repeated修饰之后,也会增加600多行代码。详见下图:

然后在下方还会发现,不同,详见下图:

例如会在有repeated的文件中增加,internal_static_trade_Tests_descriptor的代码片段

还会增加对于list的简单描述。

4.2  关于requird和optional修饰符的区别

先看配置文件,如下图:

再来看生成的java代码的区别:

首先会调整说明注释,如下图

然后,关键代码也会进行调整,如下图:不一样的代码required和optional-1

不一样的代码required和optional-2

不一样的代码required和optional-3

通过代码我们可以看出,required的选项应该表示该字段必选,optional表示可先。

最后那个\001 和\002的区别,我查到了之后再补充吧。

这个是在网上找的一段关于这个\002的说明,有懂的人帮着确认或者解释一下吧。

Control Characters

CTRL   (^D means to hold the CTRL key and hit d)

Oct  Dec Char  Hex  Key     Comments

\000   0  NUL  \x00  ^@ \0 (Null byte)

\001   1  SOH  \x01  ^A    (Start of heading)

\002   2  STX  \x02  ^B    (Start of text)

时间: 2024-11-05 16:28:15

protobuf的配置原始文件.proto中,使用修饰符repeated、required、optional生成的java文件的区别的相关文章

java中权限修饰符public、private、protected和default的区别

1.public 可以修饰类.成员变量和成员函数,没有任何限制,同一个包中,或者不同包中的类都可以自由访问 2.private 可以修饰成员变量和成员函数,只能在本类中使用 3.default (不写权限修饰符,就是default权限)可以修饰类.成员变量和成员函数,在同一个包中,可以自由访问.如果子类和父类不在同一个包中,子类可以继承到父类中的default权限的成员变量和成员函数,但是由于权限不够,无法使用 4.protected protected权限首先拥有和default一样的功能,但

C#语言中的修饰符汇总

1. 访问修饰符 指定声明的类型和类型成员的可访问性. (1) public:对任何类和成员都公开, 无限制访问;是类型和类型成员的访问修饰符.公共访问是允许的最高访问级别.对访问公共成员没有限制. (2) private:仅仅对该类公开;是一个成员访问修饰符.私有访问是允许的最低访问级别.私有成员只有在声明它们的类和结 构体中才是可访问的. (3) internal:只能值包含该类的程序集中访问该类(只是单独的项目,而不是整个解决方案);是类型和类型成员的访问修饰符.只有在同一程序集的文件中,

C#中访问修饰符

范围(从小到大):private<internal/protected<protected internal<public private:只能在本类中使用internal:只能在本程序集(本项目)中使用protected:只能在具有继承关系的子类中使用(可以在不同的项目中)protected internal:在本程序集中或在不同的程序集中但是具有继承关系就可以使用public:都能使用 注意:1.如果类没有使用显示的修饰符,默认为internal,类的访问修饰符只能是public和i

java学习笔记(三)java中的修饰符abstract、static与final

一.四种访问级别的访问范围 访问级别 访问修饰符 同类 同包 子类 不同的包 公开 public 受保护 protected 默认 没有访问修饰符 私有的 private 二.使用abstract修饰符需要遵守的语法规则 1.抽象类中可以没有抽象方法,但是包含抽象方法的类必须定义为抽象类,即用abstract修饰: 2.抽象类跟抽象方法不能被final修饰符修饰: 3.抽象类中可以有非抽象方法,因为继承抽象类的子类必须重写父类中所有的抽象方法,因此抽象类中不能有抽象构造方法和抽象静态方法: 4.

java中Volatile修饰符的含义

在java语言中:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值进行对比. volatile关键字的作用就是提示vm:对于这个成员变量不能保存它的私有拷贝,而应直接与共享变量进行交互. 被volatile修饰符修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值.而且,当成员变量发生变化时,又强迫线程将变化了的值写回共享内存,这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值.这样当多个线程同时与某个

Java中的修饰符

在java中,修饰符分为访问权限修饰符和非访问权限修饰符.可以被修饰符修饰的java语言元素有类,变量,方法和接口.下面分别描述在这四个元素上使用修饰符的作用. 类 java中声明类的格式为: 访问修饰符 修饰符 class 类名 extends 父类名称 implements 接口名称{} 其中访问修饰符和修饰符可以互换位置,可以应用于类的访问修饰符为public和package,public表明类可以被任何类使用.package表示包访问权限,它是默认的访问权限,可以省略这个修饰符,使用pa

【转】C# 中访问修饰符

用通过代码:  类内部 using System;class Mod{    void defaultMethod()    {        Console.WriteLine("this is a default method");    }    public void publicMethod()    {        Console.WriteLine("this is a public method");    }    private void pr

Java面向对象编程之Java语言中的修饰符

近日,读了孙卫琴老师的<Java面向对象编程>一书,心中颇有些感悟,想着将其记录下来. Java中的修饰符 在Java语言中,有这样一些单词(说得再准确点儿,应该是形容词):abstract(抽象的).static(静态的).public(公共的).protected(受保护的).private(私有的).synchronized(同步的).native(本地的).transient(暂时的).volatile(易失的)和final(不可改变的),它们被成为修饰符,这些修饰符可以修饰类.变量和

Java中final修饰符深入研究

一.开篇 本博客来自:http://www.cnblogs.com/yuananyun/ final修饰符是Java中比较简单常用的修饰符,同时也是一个被"误解"较多的修饰符.对很多Java程序员来说,他们大都只是草草看了一下各种书本上的介绍,然后背下来,什么时候想起 来有这东西就用一下.对于何时使用final修饰符.使用final修饰符对程序有什么影响,这些其实他们并不知道,当然在这篇文章之前,我也是一知半解的. 我们书本上对final的描述大概有三种用法: final可以修饰变量,