提问人:Денис Анд 提问时间:11/1/2023 最后编辑:Денис Анд 更新时间:11/1/2023 访问量:44
Spring Boot 原生镜像无法序列化 protobuf 对象
Spring boot native image can not serialize protobuf object
问:
我有方法
@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(),但正如我提到的,我做到了,但它没有帮助,所以仍然缺少一些东西,但不清楚到底是什么
如何解决?
答:
“无法放入缓存:user_identities_proto。无法序列化“表示当您尝试使用 Redis 缓存对象时,GraalVM 无法序列化该对象。
Spring 中的注解使用 Java 的默认序列化机制,但 protobuf 类不支持开箱即用的 Java 序列化。它们需要使用 protobuf 自己的序列化机制进行序列化。 依赖于 Java 内置的序列化,它与 protobuf 对象不兼容。
您应该使用与 protobuf 兼容的其他 Redis 序列化程序。Spring Data Redis 提供了一些选项,但您可能需要实现自己的选项或找到支持 protobuf 的第三方库。UserIdentitiesResponse
@Cacheable
JdkSerializationRedisSerializer
评论