#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
аннотация для той же цели, но она работает наоборот