Spring Data 和 Redis - 序列化瞬态字段

Posted

技术标签:

【中文标题】Spring Data 和 Redis - 序列化瞬态字段【英文标题】:Spring Data and Redis - serializing transient fields 【发布时间】:2018-09-23 22:20:26 【问题描述】:

我使用 Redis 作为包含 Spring 数据的数据库,没有自定义值或哈希值序列化程序。我假设标准 JdkSerializationRedisSerializer 应该用于对象序列化。 看起来某些对象的瞬态字段已序列化到数据库中。

瞬态字段修饰符、瞬态方法注释、@JsonIgnore 属性——所有这些似乎都不会影响字段的序列化。

我该如何克服这个问题?

【问题讨论】:

【参考方案1】:

我遇到了这个问题,虽然我最初将该字段标记为瞬态,但我相信这会使它成为瞬态 ;-) 当涉及到 spring data redis 时它没有。

对我有用的是注释字段:

    ...
    import org.springframework.data.annotation.Transient;
    ...
    @Transient
    private ReadWriteLock lock = new ReentrantReadWriteLock();

pojo 不必实现 Serializable 并且该字段不必标记为瞬态。我想这样做仍然是很好的 Java 实践,但这不是必需的。

【讨论】:

发布了上述内容后,我已经阅读了这个答案,这可能会更好地解释它:***.com/a/35641998/1279002【参考方案2】:

我知道这对可怜的马特来说已经晚了两年,但我们最近也遇到了这个问题。 似乎起作用的是:

    在 Java 类上设置序列化 ID。 Eclipse 和 IntelliJ 都会为您生成一个。 -1 似乎不起作用。 使用瞬态 Java 修饰符,而不是 Spring @Transient 标记。

public class CachedValues implements Serializable 
    private static final long serialVersionUID = -914745617137492359L;
    private Long id;
    private transient String nonRedisField;
    ...

【讨论】:

【参考方案3】:

我们遇到了同样的问题,我也使用了瞬态(java 关键字)和 org.springframework.data.annotation.Transient 注释,但它不起作用,但使用 com.fasterxml.jackson.annotation.JsonIgnore 成功了。

这实际上取决于下划线redis是如何实现的,以及它使用什么序列化器或反序列化器。

【讨论】:

以上是关于Spring Data 和 Redis - 序列化瞬态字段的主要内容,如果未能解决你的问题,请参考以下文章

谈谈spring-boot-starter-data-redis序列化

原创Spring Data Redis <=2.0.3反序列化漏洞

Spring Data Redis 序列化

Spring Data Redis入门示例:基于RedisTemplate

Spring Data Redis —— 快速入门

spring-session-data-redis反序列化问题