考虑以下情况:
有一个序列化文件,由旧版本的应用程序创建.不幸的是,已经序列化了类的包已更改.现在我需要将此文件中的信息加载到同一个类中,但位于不同的包中.此类已serialVersionUID定义且未更改(即兼容).
问题:是否可以使用任何技巧从该文件加载新的类实例(除了将类复制到旧包中然后使用反序列化包装器逻辑)?可以用来readResolve()从移动/重命名类中恢复吗?如果没有,请解释原因.
我正在尝试在2个不同的Spring Boot应用程序之间实现简单的Kafka通信,没有任何特殊设置,该应用程序只有一个kafkalistener。我给消费者的yml是:
spring:
kafka:
bootstrap-servers: ip_here
topic:
json: topic_here
consumer:
group-id: group_id
auto-offset-reset: earliest
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
properties:
spring:
json:
trusted:
packages: 'com.example.kw.dtos.Classdata'
Run Code Online (Sandbox Code Playgroud)
我收到的错误如下:
原因:java.lang.IllegalArgumentException:类'com.example.kw.dtos.Classdata'不在受信任的程序包中:[java.util,java.lang,com.example.kw.dtos.Classdata]。如果您认为该类别可以安全地反序列化,请提供其名称。如果序列化仅由受信任的源完成,则还可以启用全部信任(*)。
该程序包在受信任的程序包中,但是出了点问题。
我的工厂班:
@Configuration
@EnableKafka
public class MsgListener {
@Value("${spring.kafka.bootstrap-servers}")
private String bootstrapServers;
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
props.put(ConsumerConfig.GROUP_ID_CONFIG, "json");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put(JsonDeserializer.TRUSTED_PACKAGES, "com.example.kw.dtos.Classdata");
return props;
}
@Bean
public ConsumerFactory<String, Classdata> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(
consumerConfigs(),
new StringDeserializer(),
new JsonDeserializer<>(Classdata.class));
}
@Bean
public …Run Code Online (Sandbox Code Playgroud)