Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Мониторинг процесса сериализации
Список форумов
 ->  Сериализация (Serialization API)


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
KBobryakov : 5
Новичок

СообщениеМай 07, 2009 23:09 
Ответить с цитатой
Добрый день.

Есть маленькая задача.

Мы сохраняем какой-нибудь объект в файл используя сериализацию.
Как отобразить в JProgressBar'е этот процесс в соответствии с процентом уже сохраненных данных.

При процессе десериализации это реализовать можно, а при сериализации? Если да, то как?

Заранее спасибо...
К началу Посмотреть профиль Отправить личное сообщение
gesser : 3589
JavaTalks Team Member

СообщениеМай 08, 2009 0:05 
Ответить с цитатой
http://forums-beta.sun.com/thread.jspa?messageID=2186139
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
KBobryakov : 5
Новичок

СообщениеМай 08, 2009 1:44 
Ответить с цитатой
Вырежу от туда кусочек, чтобы лишний раз не ходить, ссылка есть выше ...

An object stream is not really aware of what it is serializing and when but you could implement readObject/writeObject in your serialized objects and increment a counter when the method is called. It should just call stream.defaultRead/WriteObject() after incrementing the counter.

The counter would be stored in your own derivation of ObjectInput/OutputStream and you reset it prior to serializing the vector. Cast to it in read/writeObject().

You would need to take care to implement the methods only in those objects that you want to track the progress of and, I guess, know in advance how many of them will be serialized by a given stream invocation.


Я использую ObjectOutputStream.
В нем идет перегрузка метода writeObject:
Код:

public final void writeObject(Object obj) throws IOException {
   if (enableOverride) {
       writeObjectOverride(obj);
       return;
   }
   try {
       writeObject0(obj, false);
   } catch (IOException ex) {
       if (depth == 0) {
      writeFatalException(ex);
       }
       throw ex;
   }
}


Дальше этого метода лезть бесполезно, так как используются private методы. А этот перегрузить нельзя.

Остается последний вариант - перегрузить writeByte и writeInt и т.д.

Вот только в классе - потомке от ObjectOutputStream перегружая все методы write**** получаю счетчик равный 60, и он не зависит от объекта.

Можете подсказать какой конкретно метод нужно перегрузить ...
К началу Посмотреть профиль Отправить личное сообщение
KBobryakov : 5
Новичок

СообщениеМай 08, 2009 1:57 
Ответить с цитатой
Или как сделать следующее...
Сделать класс-потомок ObjectOutputStream, но в котором перегружен метод
Код:
 
    public void write(byte b[]) throws IOException {
   write(b, 0, b.length);
    }


класса OutputStream, от которого унаследован ObjectOutputStream.

Во как )))


Или можно пример реализации вот этой строчки ...

The counter would be stored in your own derivation of ObjectInput/OutputStream and you reset it prior to serializing the vector. Cast to it in read/writeObject().
К началу Посмотреть профиль Отправить личное сообщение
KBobryakov : 5
Новичок

СообщениеМай 08, 2009 11:21 
Ответить с цитатой
Нашел лишь следующее решение ...




Код:

ObjectOutputStream oos = new ObjectOutputStream(new NewClass(new File("")));
oos.writeObject(obj);



Код:

public class NewClass extends FileOutputStream {

    int num = 0;

    public NewClass(File file) throws FileNotFoundException {
        super(file);
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        num+= len;
        System.out.println(num);
        super.write(b, off, len);
    }
}



Теперь думаю как узнать размер файла, который будет создан, чтобы отобразить ход записи в процентах...
К началу Посмотреть профиль Отправить личное сообщение
gesser : 3589
JavaTalks Team Member

СообщениеМай 08, 2009 11:50 
Ответить с цитатой
В java точные размеры объекта узнать не возможно. Может сделать какой-то метод в каждом серриализуемом объекте, который хотя бы приблизительно даст свой размер. Правда не факт что размер объекта будет совпадать с размером его serial копии.

Да ... интересная задачка.


Последний раз редактировалось: gesser (Май 08, 2009 12:39), всего редактировалось 1 раз
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
KBobryakov : 5
Новичок

СообщениеМай 08, 2009 12:26 
Ответить с цитатой
Да, я так и поступил.
У меня идет запись ArrayList'а объектов класса с множеством полей.
Посмотрел сколько байт записывается при ArrayList.size() == 100, 1000, 10000.

Получилось, что каждый объект в ArrayList'е занимает Xбайт + 123 байта на сам ArrayList.

Коряво, но РАБОТАЕТ )))

Большое спасибо за дискуссию ...
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Сериализация (Serialization API)


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru