[英]JSON Serialization of BitSet doesn't work
我想以JSON格式序列化/反序列化java.util.Bitset。 這段代碼:
BitSet bs = new BitSet(10);
bs.set(1);
bs.set(5);
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(System.out, bs);
打印{“ empty”:false}作為輸出。 我應該編寫自己的串行器/解串器還是有更好的方法?
ObjectMapper.writeValue()將調查對象類並找到所有getSomething方法和isSomething方法,以根據方法名稱生成json。
您的結果{“ empty”:false}來自BitSet類的此方法:
public boolean isEmpty() {...}
因此,我認為您應該編寫自己的序列化器/反序列化器,而不要使用ObjectMapper序列化機制
嘗試對Bitset使用自定義序列化器和反序列化器。
串行:
public class BitSetSerializer extends JsonSerializer<BitSet> {
@Override
public void serialize(BitSet value, JsonGenerator gen,
SerializerProvider serializers) throws IOException, JsonProcessingException {
gen.writeStartArray();
for (int i = 0; i < value.length(); i++) {
gen.writeBoolean(value.get(i));
}
gen.writeEndArray();
}
}
Deserilizer:
public class BitSetDeserializer extends JsonDeserializer<BitSet> {
@Override
public BitSet deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
BitSet ret = new BitSet();
int i = 0;
JsonToken token;
while (!JsonToken.END_ARRAY.equals(token = jsonParser.nextValue())) {
if (JsonToken.VALUE_TRUE.equals(token))
ret.set(i);
i++;
}
return ret;
}
}
謝謝! 我認為,我有一個解決方案,對我來說似乎可以節省更多的空間和內存-這是非常重要的,因為要處理大量的數據。 以下解決方案做到了:
public class BitSetSerializer extends JsonSerializer<BitSet>
{
@Override
public void serialize(BitSet value, JsonGenerator gen, SerializerProvider serializers)
throws IOException, JsonProcessingException
{
gen.writeStartArray();
for (long l : value.toLongArray())
{
gen.writeNumber(l);
}
gen.writeEndArray();
}
@Override
public Class<BitSet> handledType()
{
return BitSet.class;
}
}
public class BitSetDeserializer extends JsonDeserializer<BitSet>
{
@Override
public BitSet deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException
{
ArrayList<Long> l = new ArrayList<Long>();
JsonToken token;
while (!JsonToken.END_ARRAY.equals(token = jsonParser.nextValue()))
{
if (token.isNumeric())
{
l.add(jsonParser.getLongValue());
}
}
return BitSet.valueOf(Longs.toArray(l));
}
}
SimpleModule testModule = new SimpleModule("MyModule");
testModule.addSerializer(new BitSetSerializer());
testModule.addDeserializer(BitSet.class, new BitSetDeserializer());
BitSet bs = new BitSet();
bs.set(1);
bs.set(1500);
System.out.println(bs);
ObjectMapper mapper = new ObjectMapper();
// mapper.registerModule(new Jdk8Module()); //serialization result takes too much space
mapper.registerModule(testModule);
String val = mapper.writeValueAsString(bs);
System.out.println(val);
BitSet bs2 = mapper.readValue(val, BitSet.class);
System.out.println(bs2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.