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

Тема в разделе "Lotus + Java + LS2J", создана пользователем VladSh, 11 окт 2012.

  1. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Идея в общем-то хорошая.. но что-то не хочет:
    <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?
    Коллеги, у кого-то получилось побороть?
     
  2. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    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]
    то выдаёт:
    При чтении с помощью класса 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)
    Спецы, пожалуйста допомогайте, а то идеи закончились! :(
     
  3. Zeka

    Zeka Well-Known Member

    Регистрация:
    1 сен 2009
    Сообщения:
    219
    Симпатии:
    0
    Засунь Test в JAR и положи его в ext/lib.
    И будет тебе счастье :(
     
  4. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Zeka
    Я так понял, что метод resolveClass, на котором всё валится, вызывается у класслоадера, который ни сном ни духом про мои библиотеки в лотусе?
    Осталось разобраться как "засунуть Test в JAR" и как потом обновлять эти jar'ы на клиентах пользователей...
     
  5. Zeka

    Zeka Well-Known Member

    Регистрация:
    1 сен 2009
    Сообщения:
    219
    Симпатии:
    0
    "засунуть Test в JAR" - я Test.java в обычном Eclipse написал. Там же в два клика экспорт в JAR и сделал.
    Не пробывал, но, вроде, и в Domino Designer, если открыть Java perspective, получится точно так же экспортировать класс в JAR.

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

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

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Ага, спасибо! В Eclipse без проблем экспортировал, в Lotus Designer для этого надо чтобы библа была открыта, тогда в навигаторе отображается её пакеджи.
    Что интересно, - Eclipse сгенерировал class-файл 371kb, а Lotus Designer - 240, файл MANIFEST.MF у обоих одинаковый, оба jar'а работают..

    Было бы неплохо :)

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.077
    Симпатии:
    300
    про обновление - достаточно корректный манифест класть в jar, собсно кот. и будет сообщать о версии либы
    класслоадеры - дальше древних экспериментов (вне домины) у мя не пошло...
    будет время - можно поиграться (но перспективы не радужные, по времени)
     
  8. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Наверное общеизвестно, но нарыл)):

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

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

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

Поделиться этой страницей