Skip to content

Commit 1491b93

Browse files
mp911dechristophstrobl
authored andcommitted
DATAREDIS-1000 - Fix raw/byte array serialization via RedisSerializationContext.
We now use the correct generic parameters for raw serialization via RedisSerializationContext returning ByteBuffer. Introduce RedisSerializer.raw() and cleanups. Original Pull Request: spring-projects#459
1 parent 3839379 commit 1491b93

File tree

7 files changed

+69
-13
lines changed

7 files changed

+69
-13
lines changed

src/main/java/org/springframework/data/redis/stream/RawRedisSerializer.java renamed to src/main/java/org/springframework/data/redis/serializer/RawRedisSerializer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package org.springframework.data.redis.stream;
16+
package org.springframework.data.redis.serializer;
1717

18-
import org.springframework.data.redis.serializer.RedisSerializer;
19-
import org.springframework.data.redis.serializer.SerializationException;
2018
import org.springframework.lang.Nullable;
2119

2220
/**
21+
* Raw {@link RedisSerializer} using {@code byte[]}.
22+
*
2323
* @author Mark Paluch
2424
*/
2525
enum RawRedisSerializer implements RedisSerializer<byte[]> {

src/main/java/org/springframework/data/redis/serializer/RedisSerializationContext.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,23 @@ static <K, V> RedisSerializationContextBuilder<K, V> newSerializationContext(Ser
7979
}
8080

8181
/**
82-
* Creates a new {@link RedisSerializationContext} using a {@link SerializationPair#raw()} serialization pair.
82+
* Creates a new {@link RedisSerializationContext} using a {@link SerializationPair#raw() ByteBuffer} serialization
83+
* pair.
8384
*
8485
* @return
8586
*/
86-
static RedisSerializationContext<byte[], byte[]> raw() {
87-
return just(SerializationPair.raw());
87+
static RedisSerializationContext<ByteBuffer, ByteBuffer> raw() {
88+
return just(RedisSerializerToSerializationPairAdapter.raw());
89+
}
90+
91+
/**
92+
* Creates a new {@link RedisSerializationContext} using a {@link RedisSerializer#raw() byte[]} serialization.
93+
*
94+
* @return
95+
* @since 2.2
96+
*/
97+
static RedisSerializationContext<byte[], byte[]> byteArray() {
98+
return just(RedisSerializerToSerializationPairAdapter.byteArray());
8899
}
89100

90101
/**
@@ -207,7 +218,7 @@ static <T> SerializationPair<T> just(RedisElementReader<? extends T> reader,
207218
*
208219
* @return a pass through {@link SerializationPair}.
209220
*/
210-
static <T> SerializationPair<T> raw() {
221+
static SerializationPair<ByteBuffer> raw() {
211222
return RedisSerializerToSerializationPairAdapter.raw();
212223
}
213224

src/main/java/org/springframework/data/redis/serializer/RedisSerializer.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,16 @@ static RedisSerializer<String> string() {
9292
return StringRedisSerializer.UTF_8;
9393
}
9494

95+
/**
96+
* Obtain a raw {@link RedisSerializer} that passes thru {@code byte[]}.
97+
*
98+
* @return never {@literal null}.
99+
* @since 2.2
100+
*/
101+
static RedisSerializer<byte[]> raw() {
102+
return RawRedisSerializer.INSTANCE;
103+
}
104+
95105
default boolean canSerialize(Class<?> type) {
96106
return ClassUtils.isAssignable(getTargetType(), type);
97107
}

src/main/java/org/springframework/data/redis/serializer/RedisSerializerToSerializationPairAdapter.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.springframework.data.redis.serializer;
1717

18+
import java.nio.ByteBuffer;
19+
1820
import org.springframework.data.redis.serializer.RedisSerializationContext.SerializationPair;
1921
import org.springframework.lang.Nullable;
2022
import org.springframework.util.Assert;
@@ -31,18 +33,25 @@ class RedisSerializerToSerializationPairAdapter<T> implements SerializationPair<
3133
private final static RedisSerializerToSerializationPairAdapter<?> RAW = new RedisSerializerToSerializationPairAdapter<>(
3234
null);
3335

36+
private final static RedisSerializerToSerializationPairAdapter<byte[]> BYTE_ARRAY = new RedisSerializerToSerializationPairAdapter<>(
37+
RedisSerializer.raw());
38+
3439
private final DefaultSerializationPair pair;
3540

36-
protected RedisSerializerToSerializationPairAdapter(@Nullable RedisSerializer<T> serializer) {
37-
pair = new DefaultSerializationPair(new DefaultRedisElementReader<>(serializer),
41+
RedisSerializerToSerializationPairAdapter(@Nullable RedisSerializer<T> serializer) {
42+
pair = new DefaultSerializationPair<>(new DefaultRedisElementReader<>(serializer),
3843
new DefaultRedisElementWriter<>(serializer));
3944
}
4045

4146
@SuppressWarnings("unchecked")
42-
public static <T> SerializationPair<T> raw() {
47+
static SerializationPair<ByteBuffer> raw() {
4348
return (SerializationPair) RAW;
4449
}
4550

51+
static SerializationPair<byte[]> byteArray() {
52+
return BYTE_ARRAY;
53+
}
54+
4655
/**
4756
* Create a {@link SerializationPair} from given {@link RedisSerializer}.
4857
*

src/main/java/org/springframework/data/redis/stream/StreamMessageListenerContainer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -722,8 +722,8 @@ public <NV> StreamMessageListenerContainerOptionsBuilder<K, ObjectRecord<K, NV>>
722722

723723
if (this.hashMapper == null) {
724724

725-
hashKeySerializer(RawRedisSerializer.INSTANCE);
726-
hashValueSerializer(RawRedisSerializer.INSTANCE);
725+
hashKeySerializer(RedisSerializer.raw());
726+
hashValueSerializer(RedisSerializer.raw());
727727
return (StreamMessageListenerContainerOptionsBuilder) objectMapper(new ObjectHashMapper());
728728
}
729729

src/test/java/org/springframework/data/redis/core/ReactiveOperationsTestParams.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ RedisSerializationContext.<String, Long> newSerializationContext(jdkSerializatio
119119
RedisSerializationContext.<String, Double> newSerializationContext(jdkSerializationRedisSerializer)
120120
.key(stringRedisSerializer).value(doubleToStringSerializer).build());
121121

122-
ReactiveRedisTemplate<byte[], byte[]> rawTemplate = new ReactiveRedisTemplate<>(lettuceConnectionFactory,
122+
ReactiveRedisTemplate<ByteBuffer, ByteBuffer> rawTemplate = new ReactiveRedisTemplate<>(lettuceConnectionFactory,
123123
RedisSerializationContext.raw());
124124

125125
ReactiveRedisTemplate<String, Person> personTemplate = new ReactiveRedisTemplate(lettuceConnectionFactory,

src/test/java/org/springframework/data/redis/serializer/RedisSerializationContextUnitTests.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,32 @@ public void shouldEncodeAndDecodeValue() {
111111
assertThat(deserialized).isEqualTo(42);
112112
}
113113

114+
@Test // DATAREDIS-1000
115+
public void shouldEncodeAndDecodeRawByteBufferValue() {
116+
117+
RedisSerializationContext<ByteBuffer, ByteBuffer> serializationContext = RedisSerializationContext
118+
.raw();
119+
120+
ByteBuffer deserialized = serializationContext.getValueSerializationPair()
121+
.read(serializationContext.getValueSerializationPair()
122+
.write(ByteBuffer.wrap("hello".getBytes())));
123+
124+
assertThat(deserialized).isEqualTo(ByteBuffer.wrap("hello".getBytes()));
125+
}
126+
127+
@Test // DATAREDIS-1000
128+
public void shouldEncodeAndDecodeByteArrayValue() {
129+
130+
RedisSerializationContext<byte[], byte[]> serializationContext = RedisSerializationContext
131+
.byteArray();
132+
133+
byte[] deserialized = serializationContext.getValueSerializationPair()
134+
.read(serializationContext.getValueSerializationPair()
135+
.write("hello".getBytes()));
136+
137+
assertThat(deserialized).isEqualTo("hello".getBytes());
138+
}
139+
114140
private RedisSerializationContext<String, Long> createSerializationContext() {
115141

116142
return RedisSerializationContext.<String, Long> newSerializationContext() //

0 commit comments

Comments
 (0)