使用 spring 接入 grpc 后,由于 message、proto 对象会被代理,所以不能使用常规的 jackson 直接进行序列化,在做各种转化、日志输出、转存的时候都很不方便
使用官方的序列化工具
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.21.9</version>
<exclusions>
<exclusion>
<artifactId>protobuf-java</artifactId>
<groupId>com.google.protobuf</groupId>
</exclusion>
</exclusions>
</dependency>
- 序列化
- 补充默认值(proto 传输时,为了提高传输效率,如果是默认值会不传输)
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Message;
import com.google.protobuf.util.JsonFormat;
public class GrpcFormatUtil {
public static String messageToStr(final Message message) {
try {
// 创建一个 JsonFormat.Printer 对象并配置它以包含默认值字段
final JsonFormat.Printer printer = JsonFormat.printer().includingDefaultValueFields();
// 使用配置好的 printer 将 Protobuf 消息序列化为 JSON 字符串
final String jsonString = printer.print(message);
return jsonString;
} catch (final InvalidProtocolBufferException e) {
// log
}
}
}
其他:这个不是官方的,无法补充默认值
<!--protobuf-java-format-->
<dependency>
<groupId>com.googlecode.protobuf-java-format</groupId>
<artifactId>protobuf-java-format</artifactId>
</dependency>