2015-06-29 2 views
0

Я пытаюсь переключить свой любимый проект Java из написанного вручную SQL в Ebean. Когда я запускаю проект, я получаю сообщениеEbean не может сериализовать Деньги

Was unable to use reflection to find a constructor and appropriate getters forimmutable type interface j`avax.money.MonetaryAmount` 

, за которым следует больше ошибок, связанных с javamoney.

Я знаю, что MonetaryAmont имеет частный конструктор и инициируется с помощью общедоступного статического метода. Как сообщить Ebean, как сериализовать MonetaryAmount?

ответ

2

Я отказался от Ebean и вместо этого использовал Eclipselink. Как ни странно, именно там я нашел ответ на свой вопрос. Таким образом, для людей в такой же ситуации, как я был здесь, это то, что я должен был сделать:

То, что я искал, называется ScalarTypeConverter. Они не очень хорошо документированы в Ebean. Однако есть javadoc и по крайней мере одна проблема на GitHub о них.

Реализация Serializable не требуется в Ebean

0

Пожалуйста, ознакомьтесь с this

Ниже приводится отрывок оттуда

открытый интерфейс Serializable

Сериализуемость класса включается классом, реализовывая java.io.Serializable интерфейс . Классы, которые не реализуют этот интерфейс , не будут иметь своего состояния, сериализованного или десериализованного. Все подтипы сериализуемого класса сами сериализуемы. Сериализационный интерфейс не имеет методов или полей и служит только для , идентифицируя семантику сериализации.

Чтобы подтипы несериализуемых классов для сериализации, то подтипа может взять на себя ответственность за сохранение и восстановления состояния публики супертипа, в защите, и (если доступно) пакет поля. Подтип может взять на себя эту ответственность, только если класс , который он расширяет, имеет доступный конструктор no-arg для инициализации состояния класса . Ошибка объявить класс Serializable, если это не так. Ошибка будет обнаружена во время выполнения.

Во время десериализации поля классов, не связанных с сериализацией, будут , инициализированы с использованием открытого или защищенного конструктора no-arg класса . Конструктор no-arg должен быть доступен для подкласса, который является сериализуемым. Поля сериализуемых подклассов будут восстановлены из потока.

При обходе графика может возникнуть объект, который не поддерживает интерфейс Serializable. В этом случае будет выбрано значение NotSerializableException и будет идентифицировать класс несериализуемого объекта.

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

частная пустота writeObject (java.io.ObjectOutputStream выход) броски IOException собственной недействительным readObject (Java. io.ObjectInputStream in) throws IOException, ClassNotFoundException; private void readObjectNoData() throws ObjectStreamException;

Метод writeObject отвечает за запись состояния объекта для его конкретного класса, чтобы соответствующий метод readObject мог его восстановить. Механизм по умолчанию для сохранения полей объекта можно вызвать, вызвав out.defaultWriteObject.Метод не должен касаться состояния, принадлежащего его суперклассам или подклассам. Состояние сохраняется путем записи отдельных полей в ObjectOutputStream с использованием метода writeObject или с использованием методов примитивных типов данных, поддерживаемых DataOutput.

Метод readObject отвечает за чтение из потока, а - восстановление полей классов. Он может вызывать in.defaultReadObject для вызывать механизм по умолчанию для восстановления нестатических объектов и непереходных полей. Метод defaultReadObject использует информацию в потоке для назначения поля объекта, сохраненного в потоке, с соответственно названными полями в текущем объекте. Это обрабатывает случай, когда класс развился, чтобы добавить новые поля. Метод не должен касаться состояния, принадлежащего его суперклассам или подклассам. Состояние сохраняется путем записи отдельных полей в ObjectOutputStream с использованием метода writeObject или с использованием методов примитивных типов данных, поддерживаемых DataOutput.

Метод readObjectNoData отвечает за инициализацию состояния объекта для его определенного класса в том случае, если поток сериализации не перечисляет данный класс как суперкласс объекта Десериализованного. Это может происходить в случаях, когда принимающая сторона использует другую версию класса десериализованного класса , чем передающая сторона, а версия приемника расширяет классы, которые не продлеваются версией отправителя. Этот может также возникать, если поток сериализации был взломан; следовательно, readObjectNoData полезен для инициализации десериализованных объектов должным образом, несмотря на «враждебный» или неполный поток источника.

Сериализуемых классы, которые необходимо назначить альтернативный объект должны использоваться при записи объекта в поток должен реализовать этот специальный метод с точной подписью:

ANY-ДОСТУП-МОДИФИКАТОР writeReplace объекта() бросает ObjectStreamException;

Этот метод writeReplace вызывается сериализацией, если существует метод , и он будет доступен из метода, определенного в классе объекта, который сериализуется. Таким образом, метод может иметь приватный, защищенный и конфиденциальный доступ к пакетам . Доступ подкласса к этому методу следует за правилами доступности Java.

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

ANY-ACCESS-MODIFIER Объект readResolve() throws ObjectStreamException;

Этот метод readResolve следует тем же правилам вызова и правилам доступности, как writeReplace.

сериализации во время выполнения ассоциирует с каждым сериализуемым классом а номер версии, называемым serialVersionUID, который используется во время десериализации, чтобы проверить, что отправитель и получатель сериализованного объекта загрузили классы для этого объекта, которые совместимы с в отношении сериализации. Если приемник загрузил класс для объекта , у которого есть другой идентификатор serialVersionUID, чем у соответствующего класса отправителя , тогда десериализация приведет к InvalidClassException. Сериализуемая класс может объявить свой собственный serialVersionUID явно объявить поле с именем «serialVersionUID», который должен быть статическим, окончательными и типа длинного:

ANY-ACCESS модифицирующого статический окончательный длинный serialVersionUID = 42L;

Если сериализации класс не явно объявлять serialVersionUID, то сериализация выполнение будет вычислять значение serialVersionUID в по умолчанию для этого класса на основе различных аспектов класса, как описано в сериализации Java (TM) объект Спецификация. Тем не менее, настоятельно рекомендуется, чтобы все сериализуемые классы явно объявлять serialVersionUID значения, так как по умолчанию serialVersionUID вычисление очень чувствительно к классу деталей, которые могут варьироваться в зависимости от реализации компилятора, и таким образом, может привести к неожиданным InvalidClassExceptions во десериализации. Поэтому, чтобы гарантировать последовательное значение serialVersionUID в разных реализациях java-компилятора, сериализуемый класс должен объявить явное значение serialVersionUID. Также настоятельно рекомендует, чтобы явные объявления serialVersionUID, если это возможно, использовали частный модификатор , так как такие объявления относятся только к , сразу объявляющие поля class - serialVersionUID не являются полезными как унаследованные. Классы массивов не могут объявить явный serialVersionUID, поэтому они всегда имеют рассчитанное по умолчанию значение, но требование для сопоставления значений serialVersionUID отменяется для классов классов .

+0

Это похоже на комментарий. Это много текста. Что именно вы здесь говорите? – Reimeus

+0

@Reimeus Вопрос сам по себе широкий вопрос. У него проблемы, потому что он просто НЕ знает, как сделать класс сериализуемым. Может быть более чем одна причина, по которой что-то не так, когда он пытается Сериализовать класс MonetaryAmount. Вышеупомянутый текст может быть длинным для чтения, но это необходимо и полезно прочитать перед реализацией интерфейса Serializable. – Alp

+0

@Alp Как этот широкий вопрос? Я спросил конкретно, как хранить тип из внешней библиотеки (которая реализует Serializable btw) с использованием Ebean. –