如何知道JackSon Deserializer中正在反序列化的类?

时间:2012-02-04 12:18:39

标签: google-app-engine jackson

我正在使用app引擎数据存储区,所以我有这样的实体。

@PersistenceCapable
public class Author {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    @JsonProperty("id")
    @JsonSerialize(using = JsonKeySerializer.class)
    @JsonDeserialize(using = JsonKeyDeserializer.class)
    private Key key;

    ....
}

将模型发送到视图时,它会将Key对象序列化为Id值。然后,如果我从视图发回数据,我想使用JsonKeyDeserializer类将Id反序列化回Key对象。

public class JsonKeyDeserializer extends JsonDeserializer<Key> {

    @Override
    public Key deserialize(JsonParser jsonParser, DeserializationContext deserializeContext)
            throws IOException, JsonProcessingException {
        String id = jsonParser.getText();
        if (id.isEmpty()) {
            return null;
        }

        // Here is the problem because I have several entities and I can't fix the Author class in this deserializer like this. 
        // I want to know what class is being deserialized at runtime.

        // return KeyFactory.createKey(Author.class.getSimpleName(), Integer.parseInt(id))
    }
}

我试图在deserialize的参数中调试值,但是我找不到获取目标反序列化类的方法。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可能误解了KeySerializer / KeyDeserializer的角色:它们用于Java Map密钥,而不是数据库意义上的术语“密钥”的通用标识符。 因此,您可能需要使用常规JsonSerializer / JsonDeserializer代替。

关于类型:假设处理程序是为特定类型构造的,并且在序列化或反序列化过程中不传递额外的类型信息:在构造期间必须传递期望类型(如果处理程序用于不同类型)。 注册通用串行器或反序列化器时,可以在实现Module时执行此操作,因为其中一个参数是请求(de)序列化器的类型。

直接为属性定义处理程序时(比如使用注释时),如果您的处理程序实现了createContextual()接口ContextualSerializer(和--Deserializer)的BeanProperty回调,则可以使用此信息:{{1}传递给指定属性(在本例中为带注释的字段),您可以访问其类型。需要存储此信息以在(反)序列化期间使用。

编辑:正如作者指出的那样,我实际上误读了这个问题:KeySerializer是类名,而不是注释。