0

Jackson を使用してオブジェクトをシリアル化/逆シリアル化するクラスを作成しています。コンパイル時には、シリアライズ/デシリアライズするオブジェクトのタイプがわかりません。

と の使用法に関するいくつかの記事と質問を読みましたが、TypeReferenceまだTypeFactoryいくつかの問題があります。

私のクラスは次のようになります(無関係なコードを削除しました):

public class JsonSerializer<T> {

  private ObjectMapper objectMapper;
  private TypeReference typeReference;

  @PostConstruct
  public void init() {
      objectMapper = new ObjectMapper();
      typeReference = new TypeReference<T>(){ };
  }

  // ...


  public Object decode(CachedData cachedData) {
    try {
        return objectMapper.readValue(cachedData.getData(), typeReference);
    } // ...
  }
}

これは、これをテストするために使用しているコードのスニペットです。

public class SerializerTest {

  private JsonSerializer<Clazz> serializer;
  private ObjectMapper objectMapper = new ObjectMapper();
  private static final String CHARSET = "UTF-8";
  private Clazz data = generateData(); // creates a simple object

  @BeforeMethod
  public void beforeMethod() {
      serializer = new JsonSerializer<Clazz>();
      serializer.init();
  }

  // ...

  public void shouldDecodeDataCorrectly() throws Exception {
    CachedData cachedData = new CachedData(0, 
      objectMapper.writeValueAsString(data).getBytes(CHARSET), 
      CachedData.MAX_SIZE);

    Object object = serializer.decode(cachedData);
    assertEquals(data, object);
  }

  public static class Clazz {
    // POJO with getters and setters
  }

}

私が理解できる限り、バイトストリームから読み取った値をオブジェクトtypeReferenceに入れる必要があることをデシリアライザーに知らせるには、を使用するだけで十分です。Clazzただし、decode()メソッドによって返されるオブジェクトは依然としてMapです。これは、デシリアライズのデフォルト クラスであると理解しています。

decode()メソッドを returnに変更してみreturn objectMapper.readValue(cachedData.getData(), objectMapper.getTypeFactory().constructType(typeReference))ましたが、同じ問題が発生しています。

型をシリアライザーに渡す方法に関するものだと確信していますが、これまでのところ修正できていません。ありがとう。

4

3 に答える 3

1

正確に何をしようとしているのかは明確ではありません。コードの多くは変更されていません。具体的には の使用法TypeReferenceが間違っています: 型変数を一緒に使用することはできません。型は具体的でなければなりません。

しかし、おそらく解決策はあなたが思っていたよりも簡単です。original を追跡できる場合はClass、それ (または からの名前clazz.getName()) を保存し、逆シリアル化するときにそれを渡します。

于 2012-09-10T20:40:28.420 に答える
0

@JsonTypeInfoを確認しましたか?そのドキュメントをご覧ください。

于 2012-09-10T16:35:32.973 に答える
0

http://jackson.codehaus.org/1.9.9/javadoc/org/codehaus/jackson/type/TypeReference.htmlの javadoc に基づいて、次の ようにします。

JsonSerializer から typeReference フィールドを削除します

型参照を引数として受け取るように JsonSerializer.decode メソッドを変更します。

型参照を引数として渡す

Object object = transcoder.decode(cachedData, new TypeReference<Clazz>() {});

ところで-「トランスコーダー」は「シリアライザー」であるべきですか?打ち間違え?

于 2012-09-10T17:26:23.900 に答える