Skip to content

Commit fe48475

Browse files
committed
ObjectSerializer should deserialize using Argument<T>
1 parent 642a7d0 commit fe48475

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

core/src/main/java/io/micronaut/core/serialize/JdkSerializer.java

+20
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.micronaut.core.convert.ConversionService;
1919
import io.micronaut.core.reflect.ClassUtils;
2020
import io.micronaut.core.serialize.exceptions.SerializationException;
21+
import io.micronaut.core.type.Argument;
2122

2223
import java.io.IOException;
2324
import java.io.InputStream;
@@ -82,6 +83,25 @@ public <T> Optional<T> deserialize(InputStream inputStream, Class<T> requiredTyp
8283
}
8384
}
8485

86+
@Override
87+
public <T> Optional<T> deserialize(InputStream inputStream, Argument<T> requiredType) throws SerializationException {
88+
try {
89+
try (ObjectInputStream objectIn = createObjectInput(inputStream, requiredType.getType())) {
90+
try {
91+
Object readObject = objectIn.readObject();
92+
93+
return conversionService.convert(readObject, requiredType);
94+
} catch (ClassCastException cce) {
95+
throw new SerializationException("Invalid type deserialized from stream: " + cce.getMessage(), cce);
96+
} catch (ClassNotFoundException e) {
97+
throw new SerializationException("Type not found deserializing from stream: " + e.getMessage(), e);
98+
}
99+
}
100+
} catch (IOException e) {
101+
throw new SerializationException("I/O error occurred during deserialization: " + e.getMessage(), e);
102+
}
103+
}
104+
85105
/**
86106
* @param outputStream The output stream
87107
* @return A new {@link ObjectOutputStream}

core/src/main/java/io/micronaut/core/serialize/ObjectSerializer.java

+30
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import io.micronaut.core.serialize.exceptions.SerializationException;
1919

2020
import edu.umd.cs.findbugs.annotations.Nullable;
21+
import io.micronaut.core.type.Argument;
22+
2123
import java.io.ByteArrayInputStream;
2224
import java.io.ByteArrayOutputStream;
2325
import java.io.IOException;
@@ -58,6 +60,20 @@ public interface ObjectSerializer {
5860
*/
5961
<T> Optional<T> deserialize(@Nullable InputStream inputStream, Class<T> requiredType) throws SerializationException;
6062

63+
/**
64+
* Deserialize the given object to bytes.
65+
*
66+
* @param inputStream The input stream
67+
* @param requiredType The required type
68+
* @param <T> The required generic type
69+
* @return An {@link Optional} of the object
70+
* @throws SerializationException if there is a serialization problem
71+
* @since 2.0
72+
*/
73+
default <T> Optional<T> deserialize(@Nullable InputStream inputStream, Argument<T> requiredType) throws SerializationException {
74+
return deserialize(inputStream, requiredType.getType());
75+
}
76+
6177
/**
6278
* Serialize the given object to a byte[].
6379
*
@@ -97,6 +113,20 @@ default <T> Optional<T> deserialize(@Nullable byte[] bytes, Class<T> requiredTyp
97113
}
98114
}
99115

116+
/**
117+
* Deserialize the given object to bytes.
118+
*
119+
* @param bytes The byte array
120+
* @param requiredType The required type
121+
* @param <T> The required generic type
122+
* @return An {@link Optional} of the object
123+
* @throws SerializationException if there is a serialization problem
124+
* @since 2.0
125+
*/
126+
default <T> Optional<T> deserialize(@Nullable byte[] bytes, Argument<T> requiredType) throws SerializationException {
127+
return deserialize(bytes, requiredType.getType());
128+
}
129+
100130
/**
101131
* Deserialize the given object to bytes.
102132
*

runtime/src/main/java/io/micronaut/jackson/serialize/JacksonObjectSerializer.java

+23
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616
package io.micronaut.jackson.serialize;
1717

1818
import com.fasterxml.jackson.core.JsonProcessingException;
19+
import com.fasterxml.jackson.databind.JavaType;
1920
import com.fasterxml.jackson.databind.ObjectMapper;
2021
import io.micronaut.core.serialize.ObjectSerializer;
2122
import io.micronaut.core.serialize.exceptions.SerializationException;
23+
import io.micronaut.core.type.Argument;
24+
import io.micronaut.jackson.JacksonConfiguration;
2225

2326
import javax.inject.Singleton;
2427
import java.io.IOException;
@@ -79,4 +82,24 @@ public <T> Optional<T> deserialize(InputStream inputStream, Class<T> requiredTyp
7982
throw new SerializationException("Error deserializing object from JSON: " + e.getMessage(), e);
8083
}
8184
}
85+
86+
@Override
87+
public <T> Optional<T> deserialize(byte[] bytes, Argument<T> requiredType) throws SerializationException {
88+
try {
89+
JavaType javaType = JacksonConfiguration.constructType(requiredType, objectMapper.getTypeFactory());
90+
return Optional.ofNullable(objectMapper.readValue(bytes, javaType));
91+
} catch (IOException e) {
92+
throw new SerializationException("Error deserializing object from JSON: " + e.getMessage(), e);
93+
}
94+
}
95+
96+
@Override
97+
public <T> Optional<T> deserialize(InputStream inputStream, Argument<T> requiredType) throws SerializationException {
98+
try {
99+
JavaType javaType = JacksonConfiguration.constructType(requiredType, objectMapper.getTypeFactory());
100+
return Optional.ofNullable(objectMapper.readValue(inputStream, javaType));
101+
} catch (IOException e) {
102+
throw new SerializationException("Error deserializing object from JSON: " + e.getMessage(), e);
103+
}
104+
}
82105
}

0 commit comments

Comments
 (0)