Как правильно сериализовать / десериализовать Java Object []? - PullRequest
0 голосов
/ 30 октября 2018

Я пишу фреймворк rpc, но столкнулся с проблемой сериализации.

Вы знаете, что для перевода запроса между клиентом и сервером у меня должен быть такой класс запроса:

class Request {
    // target service class
    private Class<?> targetService;
    // target service method
    private String targetMethod;
    // target method param types
    private Class<?>[] targetParamTypes;
    // the params
    private Object[] targetParams;
    // getters & setters & contructors
}

Но:

  1. для поля targetParams, если я использую Gson в качестве инструмента сериализации, он получит ошибку com.google.gson.internal.LinkedTreeMap cannot be cast to the.packages.to.MyClass, если я добавлю POJO в targetParams, для общей проблемы.

  2. для int класса, Gson всегда анализирует его как Double, поэтому я не могу использовать targetParamTypes[i].cast(targetParams[i]) для принудительного приведения его к Integer (Double не может быть приведен к Integer), это отстой ...

Так, у кого-нибудь есть решение, чтобы решить проблему? Как сделать сериализацию / десериализацию шагов быстрой и точной? Или какие-нибудь инструменты рекомендуется?

Я пробовал:

  • Гсон, получи проблемы раньше
  • Kyro, система кодеков отстой, я не знаю, как сериализовать / десериализовать HashMap ...
  • protostuff, мммм, он не поддерживает Java 9+, мой env - Java 11, SUCK!

Так какой совет?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

используйте JSON вместо GSON и реализуйте Serializable в вашем pojo

0 голосов
/ 30 октября 2018

Вы можете взглянуть на Джексон . ObjectMapper Джексона должен быть в состоянии преобразовать из вашего Request объекта в String и наоборот.

Редактировать: добавлен пример

Запрос объекта:

class Request {

    private Class<?> targetService;
    private String targetMethod;
    private Class<?>[] targetParamTypes;
    private Object[] targetParams;

    // needed by Jackson
    private Request(){

    }

    public Request(Class<?> targetService, 
                   String targetMethod, 
                   Class<?>[] targetParamTypes, 
                   Object[] targetParams) {
        this.targetService = targetService;
        this.targetMethod = targetMethod;
        this.targetParamTypes = targetParamTypes;
        this.targetParams = targetParams;
    }

    // getters and setters, needed by Jackson

}

Пример сериализации / десериализации:

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();

    Request req = new Request(String.class, "test", new Class[] {String.class}, new Object[] {"Test"});
    String serialized = mapper.writeValueAsString(req);
    System.out.println(serialized);

    req = mapper.readValue(serialized, Request.class);
    System.out.println(req);
}
...