Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись объекта в rms 
V
    Опции темы
Brodyaga
Дата 30.10.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Всем доброго времени суток! Можно ли каким-нибудь образом записать объект в rms? Или как получить набор байт объекта?
PM MAIL   Вверх
ecologist
Дата 30.10.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: нет
Всего: 9



А в инете поискать не получается ?
http://developers.sun.com/mobility/midp/articles/persist/

PM MAIL   Вверх
Dummy
Дата 30.10.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата(ecologist @  30.10.2008,  11:53 Найти цитируемый пост)
А в инете поискать не получается ?
http://developers.sun.com/mobility/midp/articles/persist/

Да, можно так smile Но можно и не так. Можно написать общую реализацию, которая будет легко расширяема и на другие предметные области. Увы, ObjectOutputStream нам в стандартном комплекте не далиsmile Но и самому сериализацию написать несложно. Например, эта статья рассказывает и показывает, как это сделать. После того, как мы реализовали свой Object[Output|Input]Stream - достаточно в любом классе, представляющего предметную область, реализовать интерфейс Serializable - и мы получаем искомый результат.

Еще есть такая библиотечка. Не пробовал, но, судя по API, который она дает, - то, что доктор прописал.

Или можно еще портировать ObjectOutputStream из исходников Java SE, но там много и, пожалуй, чересчур сложно для небольшой задачи.

Замечательный API дает Polish: J2ME polish serialization, но, прежде чем привязываться к Polish ради одной только сериализации, стоит сто раз подумать, тем более если создаваемое приложение коммерческое...

PM MAIL   Вверх
Brodyaga
Дата 30.10.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Цитата

А в инете поискать не получается ?
http://developers.sun.com/mobility/midp/articles/persist/


В этой статье показан пример с записью строки в rms... А как объект то записать? Мне свой класс нужно записать в rms...
PM MAIL   Вверх
Dummy
Дата 30.10.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата(Brodyaga @  30.10.2008,  12:56 Найти цитируемый пост)
В этой статье показан пример с записью строки в rms... А как объект то записать? Мне свой класс нужно записать в rms... 

Мои ответы игнорируют, да? smile 
PM MAIL   Вверх
AntonSaburov
Дата 30.10.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Но класс же все равно надо сериализовать - сделать его Serializable может и  хватит
PM MAIL WWW ICQ   Вверх
Brodyaga
Дата 30.10.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Нет smile)))))))) Их сейчас смотрю... Просто ты написал, что
Цитата

Да, можно так smile 


А так совсем и нельз получается? Просто это самый лёгкий способ, вот и хотел узнать, может действительно както так и можно исхитрица? или всётаки я прав по поводу того, что этот вариант только для строк подходит?

Добавлено через 3 минуты и 13 секунд
Цитата

Но класс же все равно надо сериализовать - сделать его Serializable может и  хватит

в J2ME нет Serializable класса... так что буду смотреть вариант Dummy...
PM MAIL   Вверх
Brodyaga
Дата 30.10.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Чтото я не понял в этом примере...
Цитата

Например, эта статья рассказывает и показывает, как это сделать.

...каким макаром запись объекта получается...

Цитата


 int valor=14
 Antonio ant=null;
public void serialize(DataOutptuStream dos)
{
 dos.writeInt(this.valor);

 if(ant!=null)
 {
  dos.writeInt(9);
  
  dos.writeUTF(ant.getClass().getName());

  ((Serializable)ant).serialize(dos);

  dos.writeInt(0);
 }
}


Поясните плиз, Нафига имя класса записывается, а потом опять же этот метод вызывается... Поясните плиз?
PM MAIL   Вверх
Dummy
Дата 30.10.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата(Brodyaga @  30.10.2008,  13:16 Найти цитируемый пост)
А так совсем и нельз получается? Просто это самый лёгкий способ, вот и хотел узнать, может действительно както так и можно исхитрица? или всётаки я прав по поводу того, что этот вариант только для строк подходит?

На самом деле так, как описано в статье на http://developers.sun.com/mobility/midp/articles/persist/, делать можно для любого типа. Вопрос в том, нужно ли. К сожалению, в этой статье задача показана только на простейшем и не слишком полезном примере, когда тип объекта - String. К чему приведет попытка расширения такого решения:
  • Надо будет писать соответствующий метод для каждого нужного типа, который будет сериализовать объекты и писать их в RMS. 100 объектов - 100 методов для их сохранения? smile 
  • Мы создаем класс (в примере это StockDB), который жестко привязан к содержимому других классов, объекты которых он пишет в RMS. Он должен иметь доступ к значениям всех полей этих объектов, как на чтение (для сериализации), так и для записи (для десериализации.

ИМХО, такой дизайн нехорош, гораздо лучше доверить объекту самому представлять себе в виде последовательности байт. Как это сделать - я уже говорил .

PM MAIL   Вверх
Brodyaga
Дата 30.10.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



Цитата

Мы создаем класс (в примере это StockDB), который жестко привязан к содержимому других классов, объекты которых он пишет в RMS. Он должен иметь доступ к значениям всех полей этих объектов, как на чтение (для сериализации), так и для записи (для десериализации.


Значит так нельзя?
Цитата

MyClass myClass;
outputStream.writeUTF(myClass);


Нужно только каждое свойство класс отдельно записывать?
PM MAIL   Вверх
Dummy
Дата 30.10.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата(Brodyaga @  30.10.2008,  13:58 Найти цитируемый пост)
Поясните плиз, Нафига имя класса записывается, а потом опять же этот метод вызывается... Поясните плиз? 

Имя класса пишется для того, чтобы можно было по нему потом создать инстанс класса. А в остальном - пожалуй, несколько странный там дизайн написан, я что-то проглядел smile Методы для чтения и записи разумно перенести в Object[Output| Input]Stream , примерно так (написано на коленке, так что не сильно придирайтесь):

Код

package com.brodyaga.io.*;

...

public class ObjectOutputStream extends DataOutputStream {
     public Object writeObject(Object obj) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException {
    if (obj == null) {
        throw new NullPointerException();
    }

     writeInt(9);
     writeUTF(obj.getClass().getName());
     ((Serializable )obj).serialize(this);
     writeInt(0);
}


Код

package com.brodyaga.io.*;

...

public class ObjectInputStream extends DataInputStream {
    public Object readObject() throws IOException, ClassNotFoundException {
        Object obj = null;
        int tmp = -1;

         tmp = this.dis.readInt();
         System.out.println("en recObjectInputStream, tmp = " + tmp);

         if (tmp == 9)  {
             obj = (Serializable)
             Class.forName(dis.readUTF()).newInstance();
             ((Serializable)obj).deserialize(dis);

              if (readInt() != 0) {
                  obj = null;
             }
        }

         return obj;
    }
}


Соответственно, мы создаем определяем интерфейс Serializable следующим образом:

Код

public interface Serializable {
    public void serialize(OutputStream os) throws ... <много-чего>;
    public void deserialize(InputStream is) throws ... <много-чего>;
}


и твой объект:

Код

public class SerializableObject implements Serializable {
    public void serialize(OutputStream os) throws ... <много-чего> {
        // пишем себя в поток
    }

    public void deserialize(InputStream is) throws ... <много-чего> {
        // читаем себя из потока
    }
}


Добавлено @ 14:35
Цитата(Brodyaga @  30.10.2008,  14:29 Найти цитируемый пост)

Значит так нельзя?
Цитата

MyClass myClass;
outputStream.writeUTF(myClass);

writeUTF() только строки принимает.

Добавлено @ 14:40
Да, и еще...
Цитата(Dummy @  30.10.2008,  12:10 Найти цитируемый пост)
Или можно еще портировать ObjectOutputStream из исходников Java SE, но там много и, пожалуй, чересчур сложно для небольшой задачи.

Это я точно погорячился))) Заглянул в исходники - там работа через Reflection идет, так что в J2ME это точно не получится. Вариант отпадает.


Это сообщение отредактировал(а) Dummy - 30.10.2008, 14:41
PM MAIL   Вверх
Brodyaga
Дата 30.10.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: 2
Всего: 2



ну это всё архитектура.. общий принцип таков: нужно получить байты значений свойств класса, слепить их, и закинуть в rms, а потом также последовательно считать, создать новый объект и закинуть их туда. Так?
PM MAIL   Вверх
Dummy
Дата 30.10.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Да
PM MAIL   Вверх
MoZy
Дата 30.11.2008, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: нет
Всего: 0



Но ведь какой бы сложности/вложенности классы ни были, базовых типов немного.. реализовать для каждого такого типа функцию дампа.. а в конечном классе (и всех вложенных), в Основной процедуре дампа, составить нужную сиквенцию вызовов для каждой значимой переменной. Читать так же..
Где сложность? непонятно  smile 

Это сообщение отредактировал(а) MoZy - 30.11.2008, 23:24
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
Dummy
Дата 1.12.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 7
Всего: 19



Цитата(MoZy @  30.11.2008,  23:22 Найти цитируемый пост)
Но ведь какой бы сложности/вложенности классы ни были, базовых типов немного.. реализовать для каждого такого типа функцию дампа.. а в конечном классе (и всех вложенных), в Основной процедуре дампа, составить нужную сиквенцию вызовов для каждой значимой переменной. Читать так же..
Где сложность? непонятно  smile 

Прошу прощения, не понял, к чему это было написано и какую новую информацию содержит.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.