Spring Boot 原生镜像无法序列化 protobuf 对象

Spring boot native image can not serialize protobuf object

提问人:Денис Анд 提问时间:11/1/2023 最后编辑:Денис Анд 更新时间:11/1/2023 访问量:44

问:

我有方法

  @Cacheable(value = USER_IDENTITIES_PROTO_CACHE)
    public UserIdentitiesResponseOuterClass.UserIdentitiesResponse findUserIdentitiesProto(UUID userId) {

其中 是由 protobuff 生成的类。UserIdentitiesResponseOuterClass.UserIdentitiesResponse

使用JVM时,一切正常,但是在本机映像中,我收到异常

“无法放入缓存:user_identities_proto。无法序列化”

我试图添加

 hints.serialization()
                .registerType(TypeReference.of(UserIdentitiesResponseOuterClass.class))
                .registerType(UserIdentitiesResponseOuterClass.UserIdentity.class)
                .registerType(UserIdentitiesResponseOuterClass.UserIdentitiesResponse.class);

但这无济于事。

我正在使用 Redis 作为缓存并用于序列化。JdkSerializationRedisSerializer

原型文件的内容如下:

syntax = "proto3";

package identity;

message UserIdentity {
  string provider = 1;
  string sub = 2;
}

message UserIdentitiesResponse {
  UserIdentity primary = 1;
  repeated UserIdentity identities = 2;
}

如果应用程序在 JVM 模式(非本机)下运行,则 protobuff 对象将成功序列化/反序列化。但是在本机图像中,上述问题发生了。

我假设解决方案是添加运行时提示.serialization(),但正如我提到的,我做到了,但它没有帮助,所以仍然缺少一些东西,但不清楚到底是什么

如何解决?

Java Spring 缓存 Redis Native

评论


答:

0赞 BSB 11/1/2023 #1

“无法放入缓存:user_identities_proto。无法序列化“表示当您尝试使用 Redis 缓存对象时,GraalVM 无法序列化该对象。 Spring 中的注解使用 Java 的默认序列化机制,但 protobuf 类不支持开箱即用的 Java 序列化。它们需要使用 protobuf 自己的序列化机制进行序列化。 依赖于 Java 内置的序列化,它与 protobuf 对象不兼容。 您应该使用与 protobuf 兼容的其他 Redis 序列化程序。Spring Data Redis 提供了一些选项,但您可能需要实现自己的选项或找到支持 protobuf 的第三方库。UserIdentitiesResponse@CacheableJdkSerializationRedisSerializer

评论

0赞 Денис Анд 11/1/2023
您指的是 Spring Data Redis 的几个选项?
0赞 Денис Анд 11/1/2023
公平地说,您的答案不准确,如果不是这样说是错误的,就好像应用程序在 JVM 模式下运行(非本机)protobuff 对象已成功序列化/反序列化一样。但是在本机映像中,上述问题发生了