Использование copyProperties () вместо пользовательского сериализатора Gson — стоит ли?

#java #serialization

#java #сериализация

Вопрос:

У меня есть класс с несколькими полями, некоторые из них имеют двунаправленные отношения с другими классами. Таким образом, из-за связей между классами я не могу сериализовать класс напрямую, потому что это вызовет StackOverflowError .

Что я сделал, так это создал объект «SimpleClass» без связанных полей, и я использовал copyProperties для копирования некоторых полей из исходного класса в «упрощенный» и сериализовал его.

Вот пример:

 List<Project> projects  = projectRepository.findAllByCompany_IdOrderByDueDateAsc(id, PageRequest.of(page, limit));
Collection<SimpleProjectList> simpleProjects = new ArrayList<>();
projects.forEach(project -> {
    SimpleProjectList simpleProjectList = new SimpleProjectList();
    copyProperties(project, simpleProjectList);
    simpleProjects.add(simpleProjectList);
});
 

Класс «Project» содержит все поля (включая двунаправленные), а в «SimpleProjectList» их нет, только некоторые базовые поля. (например. ProjectName, DueDate, ProjectID и т. Д.)

Так что это просто не учитывает проблемные двунаправленные поля. Это действительно работает, но мне интересно, есть ли какой-либо другой (возможно, более быстрый) вариант.

Это нормально или для этого есть гораздо более эффективное решение?

Комментарии:

1. Если вы хотите использовать сериализацию Java, объявите поля ссылок transient , и они не будут сериализованы, что позволит избежать ошибки StackOverflowError.

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

3. Э-э, нет, это не может быть правильно. Покажите пример, если у вас возникли проблемы.

4. В любом случае, похоже, что Spring также не может найти поля. Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: io.system.backend.model.Client.company in io.system.backend.model.Company.clients потому что в классе Client поле company является временным

5. У Джексона есть @JsonIgnore аннотация на уровне поля для этого. Похоже, что у gson есть @Expose аннотация для той же цели, но она работает наоборот