我正在使用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的参数中调试值,但是我找不到获取目标反序列化类的方法。我该如何解决这个问题?
答案 0 :(得分:0)
您可能误解了KeySerializer
/ KeyDeserializer
的角色:它们用于Java Map
密钥,而不是数据库意义上的术语“密钥”的通用标识符。
因此,您可能需要使用常规JsonSerializer
/ JsonDeserializer
代替。
关于类型:假设处理程序是为特定类型构造的,并且在序列化或反序列化过程中不传递额外的类型信息:在构造期间必须传递期望类型(如果处理程序用于不同类型)。
注册通用串行器或反序列化器时,可以在实现Module
时执行此操作,因为其中一个参数是请求(de)序列化器的类型。
直接为属性定义处理程序时(比如使用注释时),如果您的处理程序实现了createContextual()
接口ContextualSerializer
(和--Deserializer)的BeanProperty
回调,则可以使用此信息:{{1}传递给指定属性(在本例中为带注释的字段),您可以访问其类型。需要存储此信息以在(反)序列化期间使用。
编辑:正如作者指出的那样,我实际上误读了这个问题:KeySerializer是类名,而不是注释。