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

Поиск:

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Для записи объекта можно реализовать метод toString() так чтобы он выдавал всю информацию об объекте, и записывать эту строку в rms. Для чтения создать конструктор с аргументом String.
PM   Вверх
zzzvyk
Дата 1.12.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 21.4.2007
Где: Киев

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



Когда я столкнулся с данной проблемой, то за основу взял вот это
http://www.garret.ru/serme.html
Единственное, что мне не нравиться, это то, что не получиться использовать обфускатор для классов реализующих  данный интерфейс.
PM MAIL Skype   Вверх
Brodyaga
Дата 3.12.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Для записи объекта можно реализовать метод toString() так чтобы он выдавал всю информацию об объекте, и записывать эту строку в rms. Для чтения создать конструктор с аргументом String.


Тоесть эти кракозяблики и есть объект!? Тоесть если я создам прочитаю это в объект то значения всех переменных сохранятся?
PM MAIL   Вверх
Dummy
Дата 3.12.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Brodyaga @  3.12.2008,  13:13 Найти цитируемый пост)
Тоесть эти кракозяблики и есть объект!? 

Предположим, у тебя есть класс MyCoolIO в пакете com.brodyaga.io. По умолчанию MyCoolIO.toString() будет возвращать строку вида "com.brodyaga.io.MyCoolIO@12345678"? Эти кракозяблики ты имеешь в виду?

Это дефолтная реализация Object.toString(), которая к имени класса объекта (то, что в кракозябликах идет до символа "@") добавляет значение его хэша (после "@"). Никакой информации об объекте, кроме разве что имени класса, из него при десериализации извлечь не получится.

math64 имел в виду то, что ты для своего класса должен переопределить метод toString() таким образом, чтобы результирующая строка содержала информацию о классе и значениях его полей в некотором формате (ну, например, структуру класса в виде XML-документа или что-то поумнее).
PM MAIL   Вверх
Выхухоль
  Дата 3.12.2008, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 9.10.2008
Где: Ташкент

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



кстати ща тоже использую rms для хранения объектов , тока чото нифига не получается..

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

//Эти вещи инициализируются в конструкторе
RecordStore Services;
RecordEnumiration r_enum;

public CurentService[] GetServices()
    {
        CurentService[] result =null;    
        if(DataStore.IsCreate(Constants.ServicesStoreName))
        {
       
        r_enum.reset();    
         result =  new CurentService[r_enum.numRecords()];
        DataOutputStream dos;
       
        for(int i=0;i<r_enum.numRecords();i++)
        {         
            try {

                result[i] = DeSerialize(r_enum.nextRecord());
            } catch (InvalidRecordIDException ex) {
                ex.printStackTrace();
            } catch (RecordStoreNotOpenException ex) {
                ex.printStackTrace();
            } catch (RecordStoreException ex) {
                ex.printStackTrace();
            }
        }
        }
        return result;
    }
    
    public void SetServices(CurentService[] CurS)
    {        
        r_enum.reset();      
        for(;r_enum.hasNextElement();)
        {
            try {
                Services.deleteRecord(r_enum.nextRecordId());
            } catch (RecordStoreNotOpenException ex) {
                ex.printStackTrace();
            } catch (InvalidRecordIDException ex) {
                ex.printStackTrace();
            } catch (RecordStoreException ex) {
                ex.printStackTrace();
            }
        }
        
       for(int i = 0;i<CurS.length;i++)
       {
          
            try {
                
                Services.addRecord(Serialize(CurS[i]), 0, Serialize(CurS[i]).length);
            } catch (RecordStoreNotOpenException ex) {
                ex.printStackTrace();
            } catch (RecordStoreException ex) {
                ex.printStackTrace();
            } 
       }
    }
    
    private byte[] Serialize(CurentService Service) 
    {
        ByteArrayOutputStream baos = null;
        try {
            baos = new ByteArrayOutputStream();
            DataOutputStream dos = new DataOutputStream(baos);
            dos.writeBoolean(Service.IsActive());
            dos.writeInt(Service.getService_Id());
            dos.writeUTF(Service.getAlias());
            dos.writeUTF(Service.getDiscription());
            dos.writeUTF(Service.getOperation_Title());
            dos.writeUTF(Service.gettitle());
            //dos.flush();
           
        } catch (IOException ex) {
            ex.printStackTrace();
        }
         return baos.toByteArray();
    }
    
    private CurentService DeSerialize(byte[] arr)
    {
        CurentService Service = null;
        try {
            
            ByteArrayInputStream bais = new ByteArrayInputStream(arr);
            DataInputStream dis = new DataInputStream(bais);

            String title = dis.readUTF();
            String opar_Title = dis.readUTF();
            String Discript = dis.readUTF();
            String Alias = dis.readUTF();
            int ID = dis.readInt();
            boolean IsActive = dis.readBoolean();
            Service = new CurentService(ID, title, opar_Title, Discript, Alias, IsActive);

            
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return Service;
    }


в строке DeSerialize String Discript = dis.readUTF(); вылетает EOFException почему????????? Ну вообщемто ясен файл закончился токо опять же ПОЧЕМУ??никак не въеду ужо три часа маюся... smile


Это сообщение отредактировал(а) Выхухоль - 3.12.2008, 20:10
PM MAIL ICQ   Вверх
eugine_s
Дата 3.12.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

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



Ты в каком порядке сохраняешь поля объекта?

Код

            dos.writeBoolean(Service.IsActive());
            dos.writeInt(Service.getService_Id());
            dos.writeUTF(Service.getAlias());
            dos.writeUTF(Service.getDiscription());
            dos.writeUTF(Service.getOperation_Title());
            dos.writeUTF(Service.gettitle());


Вот в таком порядке и доставай их: т.е. сначала Boolean, потом Int а потом 4-ре UTF (ну и эти строки alias, title - тоже читай в том порядке в каком записывал.

Код

            boolean IsActive = dis.readBoolean();
            int ID = dis.readInt();
            String Alias = dis.readUTF();
            String Discript = dis.readUTF();
            String opar_Title = dis.readUTF();
            String title = dis.readUTF();

            

Советую посмотреть на пример обычной java (j2se), открыть поток к файлу и записать в него Int, Bool, UTF - и посмотреть потом в редакторе что в этот файл записалось..

Да, и еще одно, в конце сериализации dos.flush() - раскоментируй назад.

PM MAIL   Вверх
Выхухоль
Дата 4.12.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 9.10.2008
Где: Ташкент

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



eugine_s, пасиба  smile  то что нужно..
да просто дебил на форуме отписал , а я  с его примера и делаю...там у него было сериализация в одном порядке а десир в другом...вот и доверяй после этого людям =(
PM MAIL ICQ   Вверх
W0LF
Дата 4.12.2008, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



Цитата(Выхухоль @  4.12.2008,  17:25 Найти цитируемый пост)
да просто дебил на форуме отписал 

 
M
W0LF
Выхухоль, давайте не будем оскорблять людей здесь. Просто иногда людям свойственно ошибаться. Нужно просто помимо тупого копипаста не лениться, а подключать и свой мозг, если же реально непонятно - тогда Вам здесь обязательно по возможности помогут.
Спасибо за понимание.


Это сообщение отредактировал(а) W0LF - 4.12.2008, 22:49


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Выхухоль
Дата 6.12.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 9.10.2008
Где: Ташкент

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



W0LF, ОК не буим...


Цитата(W0LF @  4.12.2008,  22:47 Найти цитируемый пост)
Нужно просто помимо тупого копипаста не лениться, а подключать и свой мозг

ток ты сам меня не оскорбляй если можно...
прозвучало раз в пять хуже чем если бы ты меня назвал просто дебилом..
PM MAIL ICQ   Вверх
W0LF
Дата 8.12.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

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



 smile 
 smile вот для того, чтоб так не звучало, как Вы озвучили и было добавлено - 
Цитата

не лениться

никоим образом обидеть не хотел


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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