Допустим, вы не каждый день пишете свои собственные JavaBeans, a тут вдруг польстились на возможность класса XMLEncoder легко и непринужденно сериализовать объекты в XML и решили написать небольшой proof-of-concept примерчик, чтобы удостовериться, что оно все работает, как обещано. С кем, в конце концов, не бывает...
"Если с первого раза не получилось, парашютный спорт не для вас..." При попытке запуситть наш простой примерчик мы получаем в консоли следующее послание от компилятора:
java.lang.IllegalAccessException: Class sun.reflect.misc.Trampoline can not access a member of class Ххх with modifiers "" Continuing ...
Вопрос: за что и что нам с этим делать?
Solution: make the class of the JavaBean public. :)
Пример #1, показывающий, что класс JavaBean нужно делать публичным
Пример #2, в котором полное счастье так и не наступает
Хорошо, мы выносим класс бина в отдельный файл и делаем его публичным, и он даже компилируется:
После чего тем, что осталось, пытаемся сериализовать его в XML:
В итоге в консоли чисто, а в текущем каталоге мы получаем такой файлик:
Уже гораздо приятнее - мы видим ссылку на объект класса MyBean_B, но хотелось бы какого-то упоминания свойств этого объекта... Может быть инициализация поможет?
Нет, не поможет, дело в том, что XMLEncoder сравнивает значения свойств со значениями по умолчанию (сразу после создания объекта), и если они совпадают, то не сериализуются. Действительно - зачем?
Пример #3, в котором уже почти хорошо
Добавим для разнообразия в наш бин немножечко BigDecimal:
И даже присвоим ему какое-нибудь значение не по умолчанию:
String - видим, int - видим, BigDecimal - не видим:
Очень жаль...
Пример #4, в котором Kuldeep.Oli избавляет нас от страданий, поведав о java.beans.PersistenceDelegate
Ссылки по теме:
JavaBeans Trail in The Java Tutorials from
Javadoc for class java.beans.XMLEncoder
No comments:
Post a Comment