如何解决 “Redis DefaultSerializer requires a Serializable payload but received an object” 错误

在我们使用 Redis 作为缓存或数据存储时,可能会遇到“Redis DefaultSerializer requires a Serializable payload but received an object”的错误。这意味着我们试图存储一个不能被序列化的对象。在本文中,我将带你逐步解决这个问题。

整体流程

为了有效解决这个问题,我们可以按照以下步骤进行:

步骤说明
第一步确定需要存储的对象
第二步确保对象实现了序列化接口
第三步使用正确的序列化工具
第四步测试并验证功能

下面我们详细说明每一步。

第一步:确定需要存储的对象

首先,我们需要明确哪个对象需要被存储。假设我们有一个简单的用户类 User,如下所示:

public class User {
    private String username;
    private int age;

    // 构造函数
    public User(String username, int age) {
        this.username = username;
        this.age = age;
    }
    
    // Getter 和 Setter 方法
    public String getUsername() {
        return username;
    }

    public int getAge() {
        return age;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

第二步:确保对象实现了序列化接口

为了让 Java 对象能被序列化,我们需要让我们的类实现 Serializable 接口。这样做可以将对象的状态转换为字节流,以便存储或传输。

import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = 1L; // 唯一标识符

    private String username;
    private int age;

    // 构造函数及其他代码不变
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

在上面的代码中,我们添加了 Serializable 接口,并且定义了一个 serialVersionUID 字段,这是 Java 序列化的最佳实践。

第三步:使用正确的序列化工具

当对象被标记为可序列化后,我们需要使用序列化工具来处理对象,例如 Spring 的 RedisTemplate。以下是一个使用 Redis 存储用户对象的示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    
    @Autowired
    private RedisTemplate<String, User> redisTemplate; // 使用 RedisTemplate

    public void saveUser(String key, User user) {
        redisTemplate.opsForValue().set(key, user); // 存储用户对象到 Redis
    }

    public User getUser(String key) {
        return redisTemplate.opsForValue().get(key); // 从 Redis 获取用户对象
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

在这个 UserService 类中,我们注入了一个 RedisTemplate 实例,并定义了 saveUsergetUser 方法,用于存储和获取对象。

第四步:测试并验证功能

最后一步是进行测试,确保功能正常。可以通过一个简单的测试类来验证之前的代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class TestUserService implements CommandLineRunner {
    
    @Autowired
    private UserService userService;

    @Override
    public void run(String... args) throws Exception {
        User user = new User("Alice", 30);
        userService.saveUser("user:1001", user); // 存储用户
        
        User retrievedUser = userService.getUser("user:1001"); // 获取用户
        System.out.printf("Username: %s, Age: %d%n", retrievedUser.getUsername(), retrievedUser.getAge());
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

在运行时,这将存储一个用户对象,然后从 Redis 中获取并打印其属性。

结尾

通过以上步骤,我们解决了 “Redis DefaultSerializer requires a Serializable payload but received an object” 的错误。确保你的对象实现了 Serializable 接口,并使用合适的序列化工具去存储和检索对象。希望这篇文章能帮助你更好地理解 Redis 与对象的序列化!如果你还有任何问题,请随时询问!