【发布时间】:2016-08-26 10:55:30
【问题描述】:
我有一个Range,需要以某种格式序列化,即"[lower,upper)"。为此,我编写了一个基本的序列化程序:
public class RangeSerializer extends StdSerializer<Range<?>> {
@Override
public void serialize(final Range<?> value, final JsonGenerator gen, final SerializerProvider provider) throws IOException {
if (value != null) {
gen.writeRaw('"');
gen.writeRaw('[');
provider.defaultSerializeValue(value.lowerEndpoint(), gen);
gen.writeRaw(',');
provider.defaultSerializeValue(value.upperEndpoint(), gen);
gen.writeRaw(')');
gen.writeRaw('"');
}
}
(请注意,实际上序列化程序处理Range 的各种可能性,例如关闭/打开范围,两端无限范围的可能性等,但出于我的问题的目的,这无关紧要,所以我已经删除它以保持代码简单)。
我的问题是,通过回退到每个类的默认序列化程序,我最终会在错误的位置使用引号。例如,如果我有一个带有条目"[foo,bar)" 的Range<String>,那么在序列化它时我会获得"["foo","bar")"。我需要在上下端点值周围不带引号的结果。
我知道额外的引号是因为底层序列化程序中的gen.writeString() 没有意识到它已经在字符串中。有什么方法可以让生成器知道这一点,或者有另一种方法来实现我想要做的事情吗?
请注意,Range<?> 确实是通用的,因此我无法对值的序列化进行硬编码。它需要适用于Range<Integer>、Range<String>、Range<DateTime> 和其他任何东西。
【问题讨论】: