|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
KBobryakov : 5 Новичок
|
Май 07, 2009 23:09 |
|
|
Добрый день.
Есть маленькая задача.
Мы сохраняем какой-нибудь объект в файл используя сериализацию.
Как отобразить в JProgressBar'е этот процесс в соответствии с процентом уже сохраненных данных.
При процессе десериализации это реализовать можно, а при сериализации? Если да, то как?
Заранее спасибо... |
|
|
|
 |
gesser : 3589 JavaTalks Team Member
|
Май 08, 2009 0:05 |
|
|
|
|
|
|
 |
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 раз |
|
|
|
 |
KBobryakov : 5 Новичок
|
Май 08, 2009 12:26 |
|
|
Да, я так и поступил.
У меня идет запись ArrayList'а объектов класса с множеством полей.
Посмотрел сколько байт записывается при ArrayList.size() == 100, 1000, 10000.
Получилось, что каждый объект в ArrayList'е занимает Xбайт + 123 байта на сам ArrayList.
Коряво, но РАБОТАЕТ )))
Большое спасибо за дискуссию ... |
|
|
|
 |
|
|
Страница 1 из 1
|
Список форумов
-> Сериализация (Serialization API) |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|