2012-02-04 3 views
1

Я использую datastore двигателя приложения, поэтому у меня есть сущность, подобная этому.Как узнать, какой класс десериализуется в JackSon Deserializer?

@PersistenceCapable 
public class Author { 

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

    .... 
} 

Когда модель отправлена ​​для просмотра, она будет сериализовать объект Key как значение Id. Затем, если я отправлю данные обратно из представления, я хочу десериализовать идентификатор обратно к объекту Key, используя класс JsonKeyDeserializer.

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)) 
    } 
} 

Я пытался отладить значение в параметрах десериализации, но я не могу найти способ получить целевую десериализацию класса. Как я могу это решить?

ответ

0

Возможно, вы неправильно поняли роль KeySerializer/: Используются для Java Map ключей, а не как общие идентификаторы в базе данных, смысл термина «ключ». Так что вам, вероятно, придется использовать обычный JsonSerializer/JsonDeserializer.

Что касается типа: предполагается, что обработчики сконструированы для определенных типов, и при процессе сериализации или десериализации не передается дополнительная информация о типе: при построении должен быть принят ожидаемый тип (если используются обработчики для разных типов). При регистрации общих сериализаторов или десериализаторов вы можете сделать это при реализации Module, так как одним из аргументов является тип, для которого запрашивается (де) сериализатор.

При определении обработчиков непосредственно свойства (например, при использовании аннотаций), эта информация доступна на createContextual() обратном вызове интерфейса ContextualSerializer (и -Deserializer), если ваш обработчик реализует его: BeanProperty передается указать свойство (в данном случае поле с аннотацией), и вы можете получить доступ к его типу. Эта информация должна храниться для использования во время (де) сериализации.

EDIT: как указал автор, я на самом деле неправильно задал вопрос: KeySerializer - это имя класса, а не аннотация.

+0

Hi, StaxMan. Спасибо за ответ на мой вопрос, но вы можете неправильно понять мой вопрос о 'KeyDeserializer', потому что я уже использовал' JsonDeserializer' для десериализации значения. Кроме того, извините, что я не упомянул, что использую Spring MVC, поэтому я использую автор '@RequestBody Author' для преобразования JSon в Java Object. Затем, после поиска 'ContextualSerializer', я думаю, что я не могу использовать его таким образом правильно? Пожалуйста, сообщите мне, если я ошибаюсь. –

+0

Ах. Плохо, читал слишком быстро. :) – StaxMan

+0

Что касается того, работает ли ContextualSerializer/Deserializer: то, что вы могли бы выяснить, - это тип «Key» - это ожидаемый статический тип. Я не уверен, что этого будет достаточно. И поскольку вы используете аннотацию, регистрация сериализаторов (de) не имеет значения: они не используются в этом случае. – StaxMan