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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохраниение объектов класса в файле 
:(
    Опции темы
Grelloo
Дата 13.6.2006, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

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



Есть несколько объектов класса News (дата, заголовок, тело), как можно сохранить, а потом извлечь их из файла 
PM MAIL ICQ   Вверх
powerOn
Дата 13.6.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Я например поступаю след. образом:
Есть у меня класс-сущность, которая содержит только информационные поля. На каждое поле добавляю setter и getter метод. А сам класс реализует интерфейс Serializable, который не содержит никаких методов.
Код

class EgidaSettingsDataSerializer implements Serializable {
    private String serverName = "";
    private String serviceName = "";
    private int port = 0;
    
    public EgidaSettingsDataSerializer(String serverName, String serviceName, int port) {
        this.serverName = serverName;
        this.serviceName = serviceName;
        this.port = port;
    }
//    
    public String getServerName() {
        return serverName;
    }
    
    public void setServerName(String serverName) {
        this.serverName = serverName;
    }
//    
    public String getServiceName() {
        return serviceName;
    }
    
    public void setServiceName(String serviceName) {
        this.serviceName = serviceName;
    }
//   
    public int getPort() {
        return port;
    }
    
    public void setPort(int port) {
        this.port = port;
    }
}



Сохраняю объект в файл. 
Код

        try {
            EgidaSettingsDataSerializer data = new EgidaSettingsDataSerializer(serverName, serviceName, port);
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(this.settingsFileName)));
            oos.writeObject(data);
            oos.close();
            System.out.println("Connection Settings saved in " + this.settingsFileName);
        } catch (Exception e) {
            System.out.println("Connection Settings not saved!");
            e.printStackTrace();
        }


Читаю объект из файла:
Код

try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(this.settingsFileName));
            EgidaSettingsDataSerializer data = (EgidaSettingsDataSerializer) ois.readObject();
            this.serverName = data.getServerName();
            this.serviceName = data.getServiceName();
            this.port = data.getPort();
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }


Сериализация, одно слово!  smile  


--------------------
user posted image нет времени думать - нужно писать КОД!

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


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



JavaBeans можно сериализовывать в XML, пример есть в FAQ


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Grelloo
Дата 14.6.2006, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

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



Ок, спасибо, буду пробовать
Кстати по поводу сериализации в XML, мне  кажется это будет медленней чем просто записывать в файл 
PM MAIL ICQ   Вверх
Grelloo
Дата 14.6.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

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



В продолжении темы хорошая статейка про сохраниние объектов http://www.javable.com/javaworld/07_00/01/
 
PM MAIL ICQ   Вверх
LSD
Дата 15.6.2006, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Неплохая статья, но оценка времени уж слишком поверхностна. На сложных объектах, с большим количеством полей, разница будет еще больше.
Но вообще они правы, самый быстрый способ, это самому реализовать метод сохранения. Причем не обязательно, использовать ObjectOutputStream и Externalizable, можно написать свои интерфейсы. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Grelloo
Дата 19.6.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

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



Так, чтобы один объект в файл записиать, а потом его считать проблем теперь нет. Теперь вопрос как записать и считать несколько объектов, хотя бы одного типа. С записью я вроде разобрался, а вот насчет того как считывать пока не понятно.  
PM MAIL ICQ   Вверх
Grelloo
Дата 19.6.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

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



Пока получилось следующее:
Создаю массив объектов и записываю его в файл, а затем считываю. 
А хотелось бы:
Дозаписывать объекты в уже существующий файл с объектами того же типа
 
PM MAIL ICQ   Вверх
Аленка
Дата 19.6.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А в чем проблема? Методы writeObject() и  readObject() можно применять последовательно. Только в случае чтения нужно соблюдать порядок. 
PM   Вверх
LSD
Дата 19.6.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Аленка @  19.6.2006,  18:22 Найти цитируемый пост)
А в чем проблема?

Проблема состоит в том, что ObjectOutputStream пишет в начало потока специальную сигнатуру, и ObjectInputStream ищет ее там. И соответсвенно если писать в поток в несколько приемов, то и читать из потока надо будет полностью соблюдая очередность открытия/закрытия потоков.

Цитата(Grelloo @  19.6.2006,  13:58 Найти цитируемый пост)
А хотелось бы:
Дозаписывать объекты в уже существующий файл с объектами того же типа

Я думаю тут самый правильный способ, будет реализовать свой механизм сериализации.
Хотя в принципе, можно поизвращаться с потоками, и реализовать механизм, который позволял бы такое делать и со стандартным механизмом. Тут надо, чтобы нижележащий поток когда надо, подсовывал сигнатуру, а когда надо проглатывал ее. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Grelloo
Дата 20.6.2006, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

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



Цитата(LSD @  19.6.2006,  21:07 Найти цитируемый пост)
Я думаю тут самый правильный способ, будет реализовать свой механизм сериализации.

Да, я то же об этом думал, надо будем поэксперементировать 
PM MAIL ICQ   Вверх
WandM
Дата 31.8.2006, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А как реализовать этот 
Цитата

самый правильный способ, будет реализовать свой механизм сериализации.

 smile 
Все дело в том, что если наследовать от ObjectInputStream, то метод readObject объявлен final, разрешено переопределить метод readObjectOverride, который будет вызываться, только если private флажок enableOverride стоит true.
enableOvveride ставится true только в конструкторе ObjectInputStream() без параметров. Конструктор ObjectInputStream(InputStream in) вызывать в таком случае нельзя. Так получается, что я должен нехилую кучу методов переопределить и связать мой класс с DataInputStream сам!
Мне всего лишь нужно, чтобы было так: 
Код
public Object readObject(){
readStreamHeader();
super.readObject();
}

И, заодно, в конструкторе ObjectInputStream(InputStream in) убрать readStreamHeader();
PM   Вверх
LSD
Дата 31.8.2006, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Под "своим механизмом сериализации" я имел в виду следующее: определяем свой интерфейс MySerializable, в которос определяем методы: serialize() и deserialize(). А как именно сохранять свои поля, уже решает сам объект. В принципе это аналог Externalizable, только сохранять можно в произвольные форматы, например XML.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sergakrem
Дата 14.9.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброе время суток.

От себя скажу вот что:
1. С сериализацией объектов (serailizable smile ) надо быть осторожным - там есть куча граблей, на которые можно наступить.

2. Вот буквально только что использлвал такой вот метод:
     
     а. Берется с Апача библиотека common beanutils
     б. Делается следующая штука (очень удобно, и судя по первоначальной постановке вопроса - именно то, что нужно):


Код

/*
 * BgItemsStore.java
 *
 * Created on 12 Sep 2006 г., 13:30
 *
 */

package xxx.xxxxxxx.xxxxxxx.xxxxxxxxxx.xxx;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;


/**
 * Store for "BgSearchingItem"s objects
 * @author skg
 */
public class BgItemsStore {
  
//  /**
//   * Store map for searching deskriptions elements
//   *
//   * Data structure of this element is the next:
//   *
//   * storeMap
//   *    |_ <Key>      <Value>
//   *       -------------------------------
//   *       <User Name>      HashSet searches
//   *                      |_  BgSearchingItem itm1
//   *                      BgSearchingItem ...
//   *                      BgSearchingItem itmN
//   */
  private HashMap storeMap;
  
  private static BgItemsStore instance;
  
  private static String rootPath;
  
  
  public static BgItemsStore getInstance(String appRootPath) {
    if (instance == null) {
      instance = new BgItemsStore();
      
      /** Save application's root path */
      instance.rootPath = appRootPath;
         
      try {
    instance.loadData();
      } catch (FileNotFoundException ex) {
    /** This means - we can't load data from storage, so - return with
     * empty hash map*/
    instance.storeMap = new HashMap();
      }
    }
    
    /** Return single object's instance */
    return instance;
  }
  
  
  /** Creates a new instance of BgItemsStore */
  private BgItemsStore() {
  }
  
  private synchronized void loadData() throws FileNotFoundException {

     ............
    
    File file = new File(...................);
    Object data = null;
    
    XMLDecoder d = new XMLDecoder(
    new BufferedInputStream(
    new FileInputStream(file)));
    try {
      data = d.readObject();
    } finally {
      d.close();
    }
    
    this.storeMap = (HashMap) data;
    
    //throw new UnsupportedOperationException("Not yet implemented");
  }
  
  public synchronized void saveData() throws FileNotFoundException {
          
           ......
    
    this.createStoreFileBackUp();
    
    Object data = this.storeMap;
    
    XMLEncoder e = new XMLEncoder(
    new BufferedOutputStream(
    new FileOutputStream(file)));
    try{
      e.writeObject(data);
    } finally{
      e.close();
    }

  }
  
  private void createStoreFileBackUp() {
    
  }
  
}



         При этом объект BgSearchingItem является обыкновенным JavaBean'ом и соответствует правилам определения для JavaBean'ов


   и в итоге вся инфа сохраняется (а затем читается)  вот в таком вот преприятнейшем формате:


Код


      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <java version="1.5.0_06" class="java.beans.XMLDecoder">
      3  <object class="java.util.HashMap">
      4   <void method="put">
      5    <string>UNKNOWN</string>
      6    <object class="java.util.HashSet">
      7     <void method="add">
      8      <object class="xxx.xxxxxxx.xxxxxxx.xxxxxxxxxx.xxxx.BgSearchingItem">
      9       <void property="duration">
     10        <long>390392</long>
     11       </void>
     12       <void property="processingID">
     13        <string>ID9A994D7C-6E2D-DDDC-B903-869D137321C4</string>
     14       </void>
     15       <void property="resultsFileName">
     16        <string>/home/......./webapps/......./tmp/results/20060913.223858-ID9A994D7C-6E2D-DDDC-B903-869D137321C4.csv</string>
     17       </void>
     18       <void property="startDate">
     19        <object class="java.util.Date">
     20         <long>1158176337872</long>
     21        </object>
     22       </void>
     23       <void property="title">
     24        <string>Yo name!</string>
     25       </void>
     26      </object>
     27     </void>
     28    </object>
     29   </void>
     30  </object>
     31 </java>






Я думаю - при первоначально постановке вопроса - это то что нужно.

Это сообщение отредактировал(а) sergakrem - 14.9.2006, 13:23
PM MAIL ICQ   Вверх
LSD
Дата 14.9.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(sergakrem @  14.9.2006,  01:25 Найти цитируемый пост)
а. Берется с Апача библиотека common beanutils

Зачем они тут?

FAQ smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




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


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

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