我试图用Java实现一个JSON序列化与Genson 1.3多态类型,包括:Genson多态/通用序列化
Number
小号- 阵列
Enum
类
下面的SSCCE大致显示了我试图实现的目标:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.owlike.genson.Genson;
import com.owlike.genson.GensonBuilder;
/**
* A Short, Self Contained, Compilable, Example for polymorphic serialization
* and deserialization.
*/
public class GensonPolymoprhicRoundTrip {
// our example enum
public static enum RainState {
NO_RAIN,
LIGHT_RAIN,
MODERATE_RAIN,
HEAVY_RAIN,
LIGHT_SNOW,
MODERATE_SNOW,
HEAVY_SNOW;
}
public static class Measurement<T> {
public T value;
public int qualityValue;
public String source;
public Measurement() {
}
public Measurement(T value, int qualityValue, String source) {
this.value = value;
this.qualityValue = qualityValue;
this.source = source;
}
}
public static class DTO {
public List<Measurement<?>> measurements;
public DTO(List<Measurement<?>> measurements) {
this.measurements = measurements;
}
}
public static void main(String... args) {
Genson genson = new GensonBuilder()
.useIndentation(true)
.useRuntimeType(true)
.useClassMetadataWithStaticType(false)
.addAlias("RainState", RainState.class)
.useClassMetadata(true)
.create();
DTO dto = new DTO(
new ArrayList(Arrays.asList(
new Measurement<Double>(15.5, 8500, "TEMP_SENSOR"),
new Measurement<double[]>(new double[] {
2.5,
1.5,
2.0
}, 8500, "WIND_SPEED"),
new Measurement<RainState>(RainState.LIGHT_RAIN, 8500, "RAIN_SENSOR")
)));
String json = genson.serialize(dto);
System.out.println(json);
DTO deserialized = genson.deserialize(json, DTO.class);
}
}
号和阵列行之有效外的开箱,但枚举类是提供一个小小的挑战。在这种情况下,序列化JSON形式必须是IMO一个JSON对象包括:
- 类型成员
- value成员
望着EnumConverter
类我看到,我需要提供自定义Converter
。不过,我不能完全掌握如何正确注册Converter
,以便它在反序列化被调用。如何用Genson解决这个序列化问题?
我实现了一个基于此的解决方案和[工厂]的javadocs(http://owlike.github.io/genson/Documentation/Javadoc/com/owlike/genson/Factory.html)和[ChainedFactory](http ://owlike.github.io/genson/Documentation/Javadoc/com/owlike/genson/convert/ChainedFactory.html),其中还提供了相关的代码示例。 –