【RPC】GRPC message 序列化

173 阅读1分钟

使用 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>