簡體   English   中英

BitSet的JSON序列化不起作用

[英]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;
}
}

嘗試添加:

 mapper.registerModule(new Jdk8Module());

傑克遜自己的單元測試中有針對BitSet的單元測試 您不需要自己動手。

謝謝! 我認為,我有一個解決方案,對我來說似乎可以節省更多的空間和內存-這是非常重要的,因為要處理大量的數據。 以下解決方案做到了:

   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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM