2016-10-10 2 views
1

Я хотел бы сгенерировать Id для данного Java-класса, проверив его имена полей, типы и все остальные компоненты класса, которые играют роль во время сериализации и десериализации, не обязательно сериализации Java, так как это может быть Json и т. Д. .Как сгенерировать идентификатор serialVersionUID для класса Java во время выполнения?

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

Я прочитал, что Java применяет сложную процедуру для определения serialVersionUID, если ни одна из них не объявлена. Он рассматривает членов класса, его супер интерфейсы и т. Д. Это похоже, но я хотел бы генерировать идентификаторы для не-Serializable классов.

Мой блейд-код заключается в том, что я храню объекты Java во внешнем хранилище данных, и я хотел бы включить этот ключ, сгенерированный во время выполнения, в ключ, чтобы грамотно обрабатывать неотправляемые изменения.

+0

Eclipse может генерировать его автоматически во время компиляции. Зачем вам это нужно создавать во время выполнения? – shmosel

+0

Вариант использования немного отличается. Это не совсем «serialVersionUID», который я ищу. Мне хотелось бы что-то подобное и что-то, что не поддерживается авторами (авторами). – phani

+2

Алгоритм вычисления serialVersionUID описан по адресу http://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100. Разумеется, вам не обязательно следовать ему точно, но важно, чтобы поля и методы были отсортированы, так как методы отражения, такие как Class.getFields(), не гарантируют порядок, в котором возвращаются члены. – VGR

ответ

0

Вы можете получить точно serialVersionUID любого класса, независимо от наличия или отсутствия поля, через ObjectStreamClass.forName(String).getSerialVersionUID().

+0

Спасибо за ответ. Я хотел бы иметь возможность генерировать id/md5/sha для несериализуемого класса (некоторые могут использовать только сериализацию на основе json). Просто обновил вопрос, чтобы сделать это требование выдающимся. – phani

Смежные вопросы