Сериализация в Lotus

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
Киев (Русь)
#1
Идея в общем-то хорошая.. но что-то не хочет:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>import java.io.Serializable;

class Test implements Serializable {
private static final long serialVersionUID = 8006446806510246677L;
public int i;
}

...
public void test(Document nd) {
try {
final String IN_CUSTOMDATA = "CustomData";

Test t = new Test();
t.i = 235;

String className = t.getClass().getName();

nd.replaceItemValueCustomData(IN_CUSTOMDATA, className, t); // здесь выбивает java.io.NotSerializableException
System.out.println("записано");

if (nd.hasItem(IN_CUSTOMDATA)) {
System.out.println("перед чтением");

Test tt = (Test) nd.getItemValueCustomData(IN_CUSTOMDATA, className);
System.out.println("результат: " + tt.i);
}
}
catch(Exception e) {
e.printStackTrace();
}
}
...[/CODE]
Не пойму, почему кажет ошибку.. может подразумевается, что надо самому реализовывать writeObject и readObject?
Коллеги, у кого-то получилось побороть?
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
Киев (Русь)
#2
Класс Test был внутренний, наверное он его не находил, потому и писал ошибку.
Добавил его с помощью New Java Class, т.е. на том же уровне, что и сновной класс агента, теперь данные записывает, но выдеёт такую ошибку:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">NotesException: Supplied Data type name does not match stored CustomData type</div></div><div class="sp-body"><div class="sp-content">at lotus.domino.local.Document.NgetItemValueCustomData(Native Method)
at lotus.domino.local.Document.getItemValueCustomData(Unknown Source)
at JavaAgent.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)
Если читать без указания имени типа:
<!--shcode--><pre><code class='java'>Test tt = (Test) nd.getItemValueCustomData(IN_CUSTOMDATA);[/CODE]
то выдаёт:
java.lang.ClassCastException: java.lang.String incompatible with Test
При чтении с помощью класса Item то же самое. Но в item'е точно что-то есть, т.к. item.hashCode() возвращает не 0.

Попробовал записывать с помощью:
<!--shcode--><pre><code class='java'>ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(t);
nd.replaceItemValueCustomDataBytes(IN_CUSTOMDATA, className, baos.toByteArray());
oos.flush();
oos.close();
baos.close();[/CODE]тогда при чтении вылетает <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">java.lang.ClassNotFoundException: Test</div></div><div class="sp-body"><div class="sp-content">
at java.lang.Class.forName(Class.java:172)
at java.io_ObjectInputStream.resolveClass(ObjectInputStream.java:618)
at java.io_ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1592)
at java.io_ObjectInputStream.readClassDesc(ObjectInputStream.java:1513)
at java.io_ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1749)
at java.io_ObjectInputStream.readObject0(ObjectInputStream.java:1346)
at java.io_ObjectInputStream.readObject(ObjectInputStream.java:365)
at lotus.domino.local.Item.getValueCustomData(Unknown Source)
at JavaAgent.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)
Спецы, пожалуйста допомогайте, а то идеи закончились! :(
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
Киев (Русь)
#4
Zeka
Я так понял, что метод resolveClass, на котором всё валится, вызывается у класслоадера, который ни сном ни духом про мои библиотеки в лотусе?
Осталось разобраться как "засунуть Test в JAR" и как потом обновлять эти jar'ы на клиентах пользователей...
 

Zeka

Well-Known Member
01.09.2009
219
0
Вильнюс
#5
"засунуть Test в JAR" - я Test.java в обычном Eclipse написал. Там же в два клика экспорт в JAR и сделал.
Не пробывал, но, вроде, и в Domino Designer, если открыть Java perspective, получится точно так же экспортировать класс в JAR.

"как потом обновлять эти jar'ы на клиентах пользователей..." - ручками, ручками... :( А если серьёзно, то кто-то на форуме агента для этого писал.

Хотя, может ещё кто-то подскажет, что там с класслоадером не так и как его "починить"?
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
Киев (Русь)
#6
Ага, спасибо! В Eclipse без проблем экспортировал, в Lotus Designer для этого надо чтобы библа была открыта, тогда в навигаторе отображается её пакеджи.
Что интересно, - Eclipse сгенерировал class-файл 371kb, а Lotus Designer - 240, файл MANIFEST.MF у обоих одинаковый, оба jar'а работают..

Хотя, может ещё кто-то подскажет, что там с класслоадером не так и как его "починить"?
Было бы неплохо :)

"как потом обновлять эти jar'ы на клиентах пользователей..." - ручками, ручками...
Тут вопрос в том, как пользователь узнает, что надо обновлять? Или при использовании в самом начале анализировать md5 jar'а? Так это долго..
Как это обычно делается?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#7
про обновление - достаточно корректный манифест класть в jar, собсно кот. и будет сообщать о версии либы
класслоадеры - дальше древних экспериментов (вне домины) у мя не пошло...
будет время - можно поиграться (но перспективы не радужные, по времени)
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
Киев (Русь)
#8
Наверное общеизвестно, но нарыл)):

XStream (при десериализации нужно вручную создать объект класса, в который будут сетиться данные):
Применение XStream для сериализации Java-объектов в XML
всё просто, потому одна ссылка.

JAXB (работает по DTD-схемам):
Alexander's blog » JAXB. Краткий обзор
Связывание данных на практике: Исследование JAXB, часть 1
XML с Java JAXB | Programming guide

Сам пока не пробовал, но интересно мнение вкушавших)