proto-gen AS3版本的protobuf extension反序列化错误解决方法

转载请注明:http://blog.csdn.net/herm_lib/article/details/8330493

前段时间用了 proto-gen AS3版本的 protobuf,用到了extension的时候,出事了,表现为,有时候反序列成功,有时候又失败,各种未定义行为。因为,先前用C++版本都很顺利,所以惯性上认为是自己代码有问题,然后各种排查,无果。然后,问同事,他们都没用到extension特性;网上查,按照proto-gen wiki上操作,不行。最后,就给pop_atry这哥们(中国人,好沟通)发邮件,原来这哥们wiki上的例子写错了,被坑了(开玩笑)。在这里,感谢pop_atry的回复。处理这个是问题有一段时间了,今天突然想到要写在blog上,让后来人得于立即解决这个问题,避免我当时解决问题的各种悲剧,浪费很多时间。

protobuf extension的使用方法请见:http://blog.csdn.net/herm_lib/article/details/7843560


定义的消息结构:

主文件 cs_msg.proto:

message MsgBody
{
    // [19000, 19999]是protobuf预留
    extensions 100 to max;  //  max is 2^29 - 1 tags分配规则见下面
}

另外一个文件cs_auth.proto:

import cs_msg.proto;
message SignReq
{
    required uint32 uid = 1;
}

extend MsgBody
{
    optional SignReq sign_req = 201;
}

序列化:

var mb:MsgBody = new MsgBody;
var singReq:SignReq = mb[SIGN_REQ];

反序列化

var mb:Msg = new MsgBody;
mb.MergeFrom(...);
void(SIGN_RES);   // 必须加一个这行
var singRes:SignRes = mb[SIGN_RES];

上面的void(SIGN_RES); 必须得加上,否则就会出现莫名其妙的解析结果。 这个用法很奇怪,我只用,但不知道什么原理。

### Spring Boot 3Protobuf 的集成与使用 在现代软件开发中,Google Protocol Buffers (简称 Protobuf) 是一种高效的序列化机制,广泛用于数据存储和通信协议。Spring Boot 3 提供了强大的功能来简化应用程序的构建过程,而通过适当配置可以轻松实现 Protobuf 集成。 以下是关于如何在 Spring Boot 3 应用程序中集成和使用 Protobuf 的详细说明: #### 1. 添加必要的依赖项 为了支持 Protobuf,在 `pom.xml` 文件中需引入以下 Maven 依赖项[^2]: ```xml <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- gRPC and Protobuf Support --> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.50.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.50.0</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java-util</artifactId> <version>3.21.7</version> </dependency> </dependencies> ``` 上述代码片段展示了所需的库版本及其作用。gRPC 和 Protobuf 支持允许开发者定义服务接口并自动生成客户端和服务端存根。 #### 2. 定义 `.proto` 文件 创建一个名为 `example.proto` 的文件,并将其放置于项目的资源目录下(通常位于 `src/main/resources/proto/`)。该文件的内容如下所示[^3]: ```proto syntax = "proto3"; option java_package = "com.example.demo"; option java_outer_classname = "ExampleProto"; service ExampleService { rpc SayHello (HelloRequest) returns (HelloResponse); } message HelloRequest { string name = 1; } message HelloResponse { string message = 1; } ``` 此部分描述了一个简单的 RPC 接口以及请求响应消息结构。 #### 3. 配置插件以生成 Java 类 为了让 Gradle 或 Maven 自动生成对应的 Java 类型,需要安装相应的编译器插件。对于 Maven 用户来说,可以在 `pom.xml` 中加入下面这段配置[^4]: ```xml <build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.6.2</version> </extension> </extensions> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> <protocArtifact>com.google.protobuf:protoc:3.21.7</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.50.0</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 这些设置确保每次构建项目时都会重新生成基于最新 .proto 文件定义的新类。 #### 4. 实现服务逻辑 一旦完成了以上准备工作,则可着手编写实际的服务处理函数。例如,针对前面提到的例子,我们可以通过继承抽象基类的方式来完成具体方法体的设计[^5]: ```java import io.grpc.stub.StreamObserver; public class ExampleServiceImpl extends ExampleGrpc.ExampleImplBase { @Override public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) { String greetingMessage = "Hello, " + request.getName(); HelloResponse reply = HelloResponse.newBuilder() .setMessage(greetingMessage) .build(); responseObserver.onNext(reply); responseObserver.onCompleted(); } } ``` 这里展示的是一个典型的同步调用模式下的服务器端实现方式。 --- ### 总结 综上所述,将 Google&#39;s Protocol Buffers 技术融入到最新的 Spring Boot 版本当中并非难事。只需遵循几个基本步骤即可成功搭建起一套完整的解决方案框架。这不仅有助于提升系统的性能表现,同时也极大地促进了跨平台间的互操作能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值