Leia BSON (mongoDB) no POJO usando GSON e TypeAdapter

Estou procurando uma maneira de ler um documento MongoDB em um POJO usando o GSON. Funciona muito bem até você encontrar coisas como datas e longos.

Gostaria de escrever um adaptador personalizado para o Gson que converterá qualquer codificação BSON por muito tempo. Lendoesta post Eu criei meu próprio adaptador:

public class BsonLongTypeAdapter extends TypeAdapter<Long>
{
    @Override
    public void write(JsonWriter out, Long value) throws IOException
    {
        out.beginObject()
           .name("$numberLong")
           .value(value.toString())
           .endObject();
    }

    @Override
    public Long read(JsonReader in) throws IOException
    {
        in.beginObject();
        assert "$numberLong".equals(in.nextName());
        Long value = in.nextLong();
        in.endObject();
        return value;
    }
}

Eu defini os seguintes testes para verificar se isso funciona:

@Test
public void canWriteCorrectJSON() {
    Gson gson = new GsonBuilder().registerTypeAdapter(Long.class, new BsonLongTypeAdapter()).create();
    MyTestObject obj = new MyTestObject(1458569479431L);
    String gsonString = gson.toJson(obj);
    assertEquals("{\"timestamp\":{\"$numberLong\":\"1458569479431\"}}",gsonString);
}

@Test
public void canReadFromJSON() {
    Gson gson = new GsonBuilder().registerTypeAdapter(Long.class, new BsonLongTypeAdapter()).create();
    MyTestObject actualTaskObject = gson.fromJson("{\"timestamp\":{\"$numberLong\":\"1458569479431\"}}", MyTestObject.class);
    MyTestObject taskObject = new MyTestObject(1458569479431L);
    assertEquals(taskObject.getTimestamp(),actualTaskObject.getTimestamp());
}

private static class MyTestObject
{
    long timestamp;

    public MyTestObject(long ts)
    {
        timestamp = ts;
    }
    public long getTimestamp()
    {
        return timestamp;
    }

    public void setTimestamp(long timestamp)
    {
        this.timestamp = timestamp;
    }
}

O primeiro teste (gravação) funciona muito bem, mas o teste de leitura falha:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a long but was BEGIN_OBJECT at line 1 column 15 path $.timestamp

Porque a função de leitura do meu adaptador nunca é chamada. Eu presumo que isso possa acontecer porque eu quero mapear para MyTestObject e não para Long, mas não quero escrever adaptadores para todas as classes que contêm longs.

É possível escrever um adaptador para o GSON que converta todos os BSON que envio para ele?

questionAnswers(1)

yourAnswerToTheQuestion