我是协议缓冲区的新手。我有一些 java pojo 类,它有一个 Date 类型的字段,仅包括年、月和日。
对于时间戳类型,我们可以
import "google/protobuf/timestamp.proto";
。
但是对于 Date 类型,我们不能这样做,因为 date.proto 位于
https://github.com/googleapis/googleapis/blob/master/google/type/date.proto
中。
那么我该如何导入这个
date.proto
?
对于时间戳类型,我们可以导入“google/protobuf/timestamp.proto”;。
因为
timestamp.proto
是Protobuf中包含的一些内置消息类型。
但是对于 Date 类型,我们不能这样做,因为 date.proto 位于 https://github.com/googleapis/googleapis/blob/master/google/type/date.proto。
proto
文件(在本例中为 date.proto
文件)。date.proto
放入你的项目中,你可以创建一个目录用于导入,例如:google/type/date.proto
protoc
生成代码;您必须使用 --proto_path
命令行标志(又名 -I
)来告诉 protoc
在哪里查找 .proto
文件。如果您不提供路径,默认情况下它只会搜索当前目录:protoc -I. --cpp_out=. usersvr.proto
这是我的演示项目的结构:
╰─$ tree
.
├── google
│ └── type
│ └── date.proto
├── usersvr.pb.cc
├── usersvr.pb.h
└── usersvr.proto
usersvr.proto:
syntax = "proto3";
package srv.user;
import "google/protobuf/timestamp.proto";
import "google/type/date.proto";
option cc_generic_services = true;
message BatchGetUserInfosRequest {
uint64 my_uid = 1;
repeated uint64 peer_uids = 2;
map<string, string> infos = 3;
google.protobuf.Timestamp timestamp = 4;
google.type.Date date = 5;
}
date.proto
是从https://github.com/googleapis/googleapis/blob/master/google/type/date.proto下载的
假设您的 Gradle(或 Maven)设置正常工作并生成代码,您必须将 .proto 文件复制到 protobuf 源文件中(例如:
project/src/main/proto
)。你只需要复制这个(如果你只关心在 Java 中使用它):
syntax = "proto3";
package google.type;
option java_multiple_files = true;
option java_outer_classname = "DateProto";
option java_package = "com.google.type";
message Date {
int32 year = 1;
int32 month = 2;
int32 day = 3;
}
然后,您将使用 Gradle 任务(或 Maven)生成 Java 代码,并且您将可以通过像这样导入来访问
Date
:
import com.google.type.Date;
之后,建议将
com.google.type.Date
的属性映射到您用作日期的任何类型,最好不要直接存储 com.google.type.Date
生成的类型。这将使您对类型有更多的控制,而如果您存储生成的类型,则无法拥有与 Java 对象相同的自由度。
注意:如果你愿意直接与
Timestamp
合作,有办法将它们转变为 Date
一些 Google 时间/日期原型位于单独的库中(与 google/protobuf 不同),因此您需要添加新的依赖项。如果使用Maven,依赖如下:
<dependency>
<groupId>com.google.api.grpc</groupId>
<artifactId>proto-google-common-protos</artifactId>
<version>2.22.0</version>
</dependency>
如果添加依赖项,则不必将原始文件复制粘贴到项目中(正如其他评论中所建议的那样)。
您需要做的就是将导入添加到您的原型文件中(原型文件名以其文件夹路径为前缀)。 例如:如果你想使用 timeOfDay.proto 文件,你需要添加以下导入:
import "google/type/timeofday.proto";
该库包含以下原型文件: