У меня есть квадратное дерево *, которое я хотел бы использовать на нескольких разных машинах. Вызов конструктора (т.е. построения дерева) занимает много времени. Я не хочу строить дерево каждый раз, когда мне нужно его использовать.Java: Можно ли десериализовать объект без вызова его конструктора?
Я ищу способ сохранить свое дерево на жестком диске, отправить его каждому узлу, а затем быстро загрузить его в память, чтобы я мог выполнять поиск.
Может ли сериализация помочь мне с этим? Я знаю, что я могу сериализовать дерево, сохранить его на диск, а затем десериализовать (это все, что я знаю о сериализации). Насколько мне известно, на этапе десерилизации требуется конструктор по умолчанию для построения дерева. Поскольку построение дерева является дорогостоящим, это бесполезно для меня.
Есть ли способ импортировать сохраненное дерево без необходимости его переустанавливать каждый раз?
* базовый код четырехъядерный дерево, которое я использовал: https://bitbucket.org/utcompling/textgrounder/src/f38150c7f33a/src/main/java/ags/utils/KdTree.java
Извинения, если это слишком основной, она тесно связана с: https://stackoverflow.com/questions/14701245/how-do-i-perform-kd-tree-lookups-in-hadoop
редактировать: Итак, похоже, что без аргументов конструктора наименее унаследованный класс - тот, который будет вызываться. Вот мой hirearchy:
аннотация KDTree
квадрадерево расширяет KdTree
SpecialQuadTree (имеет экземпляр квадрадерево)
Теперь, я только в состоянии сериализовать SpecialQuadTree, когда я делаю все Сериализуемый (в противном случае я 'получение NotSerizable или InvalidClassException без действительного конструктора):
аннотация KDTree реализует Serializable
квадрадерево расширяет KdTree реализует Serializable
SpecialQuadTree реализует Serializable (имеет экземпляр квадрадерева)
Таким образом, я полагаю, я могу взять Сериализуемые от KdTree и затем дать ему делать-ничего не-арг конструктора? Это непросто, я не писал и не понимаю класс KdTree. Я полагаю, я мог бы подкласс, не дают подклассы ничегонеделания нет-арг конструктор, и наследуют квадрадерево от этого ...
редактировать: ИТАК, у меня есть абстрактный класс абстрактный KDTree реализует Serializable
и от этого я расширяю: квадрадерево расширяет KdTree реализует Serializable
из всех моих экспериментов, мне нужно реализовать Сериализуемый на обоих. Теперь
public QuadTree() {
super(2, 1000000);
System.out.println("QuadTree no-args!");
}
и
protected KdTree(int dimensions, Integer sizeLimit) {
System.out.println("KdTree, constructor!");
Поскольку я никогда не видел его распечатать (в сторону от первоначального строительства ...), я думаю, это все хорошо.
Вы предполагаете, что сериализация и десериализация будут эффективнее, чем использование стандартизованного метода сериализации, такого как XML/JSON? – amphibient
В прошлом я всегда использовал JSON для сохранения объектов. Проблема, которую я имею сейчас, заключается в том, что я понятия не имею, как написать метод, который преобразует мой объект в JSON. – dranxo
Предлагаю посмотреть на Google protocol buf –