Python записывает байты в Redis, но Java читает его за исключением - PullRequest
0 голосов
/ 18 сентября 2018

Есть несколько байтовых переходов между Python и Java, File и Redis:

  1. File: Python write (), Java read ().(ОК)
  2. Файл: Java write (), Python read ().(ОК)
  3. Redis: Python set (), Java get ().(ОШИБКА)
  4. Redis: Java set (), Ptyhon get ().(ОК)

Это потому, что набор Python Redis () представляет собой разновидность байтовой кодировки?Я не знаю .. Помогите мне, пожалуйста.

Часть Python

redis_conn = redis.Redis(
    host=RedisHost,
    port=RedisPort,
    password=RedisPass,
    db=0
)

key   = 'key'
value = open('bytes_file', 'rb').read()

redis_conn.set(key, value)

Часть Java

@Autowired
private RedisTemplate<String, byte[]> redis;

public void readRedis() {
    String key = "key";
    redis.boundValueOps(key).get(); // exception
}

Исключение Java

org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; 
nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; 
nested exception is java.io.StreamCorruptedException: invalid stream header: 789CED9D

1 Ответ

0 голосов
/ 18 сентября 2018

Это потому, что Spring-Redis имеет значение по умолчанию valueSerializer, оно будет сериализовать необработанные byte[].

byte[] rawValue(Object value) {

    if (valueSerializer() == null && value instanceof byte[]) {
        return (byte[]) value;
    }

    return valueSerializer().serialize(value);
}

Таким образом, установив Serializer в null, решил эту проблему

@Bean
public RedisTemplate<byte[], byte[]> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<byte[], byte[]> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    // set this false will keep all Serializer null
    template.setEnableDefaultSerializer(false);
    return template;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...