Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 15.12.2009
Сообщений: 12

Сериализация файла

16.05.2010, 09:11. Показов 4291. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Делаю векторную рисовалку на Java. Возник вопрос о сохранинии файла. У меня имеется возможность сохранять в текстовом, двоичном и сериализованном виде.
Когда человек что то нарисовал и нажимает кнопку сохранить открыватеся File Chooser, в нем в фильтрах есть текстовый формат, двоичный и собственно сериализованный. Вопрос, поскольку сериализованный файл будет храниться в самой java машине, постольку после того как человек выбрал фильтр сериализованного формата он также вводит имя и сохраниет. При это же файл не создается. А как теперь граммотно открыть его? Пользователь открывает также File Chooser и что там выбирать? Как граммотно обойти эту ситуацию. ума не приложу.
Заранее спасибо за варианты решения.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2010, 09:11
Ответы с готовыми решениями:

Сериализация
Здравствуйте такое задание нужно при сохранении и обновлении данных массива объектов обеспечить диалоговый режим выбора директории с...

Сериализация+
Записываю на диск обьект типа JEditorPane. Если в jEditorPane1 были введены числа, то если открыть обьект блокнотом например, то в принципе...

Сериализация
Я записываю объект в файл при помощи сериализации, но после повторной компиляции, он не выводится из файла. Подскажите в чем проблема. По...

12
 Аватар для RZ_RZ
263 / 19 / 3
Регистрация: 26.05.2006
Сообщений: 150
17.05.2010, 15:24
А где сохраняется сериализованный файл?
0
0 / 0 / 0
Регистрация: 15.12.2009
Сообщений: 12
17.05.2010, 20:13  [ТС]
В java машине, я же это не контроллирую, в этом и есть вся прелесть.
Java
1
oos.writeObject(figures[k]);
Поэтому возникат проблема когда юзер хочет открыть сериализованный файл
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
18.05.2010, 10:33
Цитата Сообщение от torsion91 Посмотреть сообщение
В java машине, я же это не контроллирую, в этом и есть вся прелесть.
Прелесть в том, что классы Object(Out/In)putStream имеют конструкторы, принимающие в качестве аргумента другой (Out/In)putStream. Кто тебе мешает использовать File(Out/In)putStream с указанием пути к файлу, куда это все сохранять/читать?

Добавлено через 10 минут
Кстати, если после того как ObjectOutputStream#writeObject(Object) засериализует объект куда-нибудь, а потом объект будет перекомпилирован, то не факт, что ObjectInputStream#readObject() правильно его прочитает. Поэтому, имхо, удобнее создавать у объектов методы
Java
1
2
3
4
private void writeObject(ObjectOutputStream out) throws IOException {
}
private void readObject(ObjectInputStream in) throws IOException {
}
И в них описывать процесс (де)сериализации.
1
0 / 0 / 0
Регистрация: 15.12.2009
Сообщений: 12
20.05.2010, 10:57  [ТС]
aleksandy, большое спасибо, хоть за пафосный ответ с высока, но который помог мне. Просто я не понимал смысл сериализации, я думал, что при этом файл хранится в java-машише, а он хранится также как и простой файл. Спасибо еще раз!
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
22.05.2010, 14:46
Цитата Сообщение от torsion91 Посмотреть сообщение
Просто я не понимал смысл сериализации, я думал, что при этом файл хранится в java-машише, а он хранится также как и простой файл.
Ты меня, конечно, извини, но ты исейчас не понимаешь смысл сериализации. Объект сериализуется в поток, а с чем этот поток будет связан зависит от реализации. Это не обязательно должен быть файл, это может быть сокет или просто стандартный ввод-вывод. Короче, сериализация может быть в ЛЮБОЙ ПОТОК.
0
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 4
25.05.2010, 14:06
aleksandy,
Простите не стал создавать новую тему.
Тоже не пользовал сериализацию.
Есть необходимость передать объект, но похоже не подлежит сериализации.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class ObjectSend implements Serializable
{
    String serverName;
    String dataBaseName;
    String update;
    String idupdate;
    transient ByteArrayOutputStream wordFile;
 
    ObjectSend(String serverName, String dataBaseName, String update, String idupdate, ByteArrayOutputStream wordFile)
    {
        this.serverName=serverName;
        this.dataBaseName=dataBaseName;
        this.update=update;
        this.idupdate=idupdate;
        this.wordFile=wordFile;     
    }
 
    public String getServrName()
    {
        return serverName;
    }
    public String getDataBaseName()
    {
        return dataBaseName;
    }
    public String getUpdate()
    {
        return update;
    }
    public String getIdUpdate()
    {
        return idupdate;
    }
 
    public ByteArrayOutputStream getWordFile()
    {
        return wordFile;
    }
 
}
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
26.05.2010, 06:18
Цитата Сообщение от akm Посмотреть сообщение
Есть необходимость передать объект, но похоже не подлежит сериализации.
А в чем проблема? Сериализуй, кто мешает? Только вот поле wordFile не будет сериализовано, т.к. оно помечено как transient.
0
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 4
26.05.2010, 07:29
Цитата Сообщение от aleksandy Посмотреть сообщение
А в чем проблема? Сериализуй, кто мешает? Только вот поле wordFile не будет сериализовано, т.к. оно помечено как transient.
Да я уже понял, но если убрать transient, то вываливается в Exception: java.io.ByteArrayOutputStream
может конечно с потоками что-то перемутил.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
        try
        {
            System.out.println(" Servlet1 ");
            URL servlet = new URL(phpDef.getdocBase(), servletName);
            java.net.HttpURLConnection conn = (java.net.HttpURLConnection) new URL(phpDef.getdocBase(), servletName).openConnection();
            //читаем из файла в массив
            byte bytes[] = new byte[4096];
            ByteArrayOutputStream blob = new ByteArrayOutputStream();
            InputStream f = new FileInputStream(saveFile);
            int readF;
            while ((readF = f.read(bytes)) != -1) 
                {
                blob.write(bytes, 0, readF);
                blob.flush();
                }
            blob.close();
            f.close();
 
            System.out.println(" Servlet2 ");
            // серелиализуем объект для передачи
            ByteArrayOutputStream dataSO = new ByteArrayOutputStream();
            ObjectOutputStream so = new ObjectOutputStream(dataSO);
            ObjectSend stream = new ObjectSend(phpDef.getserverName(),phpDef.getdataBaseName(),phpDef.getupdate(), phpDef.getidUpdate(),blob);
            so.writeObject(stream);
            so.flush();
            so.close();
            ByteArrayInputStream dataSend = new ByteArrayInputStream(dataSO.toByteArray());
            System.out.println(" Servlet3 ");
 
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("file.name", saveFile.getName());
 
            conn.setChunkedStreamingMode(4096);
            OutputStream out = conn.getOutputStream();
            byte buffer[] = new byte[4096];
            int read;
            while ((read = dataSend.read(buffer)) != -1) 
                {
                out.write(buffer, 0, read);
                out.flush();
                }
            out.close();
            System.out.println(" Servlet4 ");
        }catch(IOException exc){System.out.println(" Блин:");System.out.println(exc.getMessage());System.out.println("Фигня! ");}
    }
консоль:
Strart to BD Servlet1
Servlet2
Блин:
java.io.ByteArrayOutputStream
Фигня!
Saved to BD

Добавлено через 33 минуты
вот измененный класс, на котором ругается

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class ObjectSend implements Serializable
{
    public static final long serialVersionUID = 6102725949207894606L;
    private String serverName;
    private String dataBaseName;
    private String update;
    private String idupdate;
    private ByteArrayOutputStream wordFile;
 
    ObjectSend(String serverName, String dataBaseName, String update, String idupdate, ByteArrayOutputStream wordFile)
    {
        this.serverName=serverName;
        this.dataBaseName=dataBaseName;
        this.update=update;
        this.idupdate=idupdate;
        this.wordFile=wordFile;     
    }
 
    public String getServerName()
    {
        return serverName;
    }
    public String getDataBaseName()
    {
        return dataBaseName;
    }
    public String getUpdate()
    {
        return update;
    }
    public String getIdUpdate()
    {
        return idupdate;
    }
 
    public ByteArrayOutputStream getWordFile()
    {
        return wordFile;
    }
 
}
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
26.05.2010, 08:08
Все сериализуемые поля объекта должны реализовывать интерфейс Serializable, чего ByteArrayOutputStream не делает. Следовательно, это поле нельзя сериализовать явно.
0
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 4
26.05.2010, 08:18
Цитата Сообщение от aleksandy Посмотреть сообщение
Все сериализуемые поля объекта должны реализовывать интерфейс Serializable, чего ByteArrayOutputStream не делает. Следовательно, это поле нельзя сериализовать явно.
а как можно?
придется пользоваться другимиметодами?
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
27.05.2010, 07:59
akm, как-то так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void writeObject(ObjectOutputStream out) throws IOException {
    out.defaultWriteObject();
    byte[] ar = wordFile.toByteArray();
    out.write(ar.length);
    out.write(ar);
}
 
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    int size = in.readInt();
    byte[] ar = new byte[size];
    in.read(ar);
    wordFile = new ByteArrayOutputStream(size);
    wordFile.write(ar);
}
Добавлено через 2 минуты
Вот еще почитай
1
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 4
29.05.2010, 10:50
aleksandy,Спасибо! Всё супер, при условии wordFile не больше 1024b.
думаю нюанс из алгоритма сериализации.

Добавлено через 46 минут
вот так вроде стало лучше:
Java
1
2
3
4
5
6
7
8
9
10
 private void readObject(ObjectInputStream fStream) throws IOException, ClassNotFoundException
{
        fStream.defaultReadObject();
        byte[] rar = new byte[size];
        fStream.readFully(rar);
        wordFile = new ByteArrayOutputStream(size);
        wordFile.write(rar,0,size);
        wordFile.flush();
        wordFile.close();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.05.2010, 10:50
Помогаю со студенческими работами здесь

Сериализация
Нужно из 1-го класса передать во второй класс объект, который будет превращен в последовательность байтов, далее записать эту...

Сериализация
куда в этом коде запишется объект? ByteArrayOutputStream bOut = new ByteArrayOutputStream(); ObjectOutputStream oOut = new...

Сериализация
Если я хочу записать два объекта на диск, то мне нужно создавать для каждого FileOutputStream и ObjectOutputStream? Или можно...

Сериализация
Здравствуйте еще раз,уважаемые.При написании мною приложения встал вопрос о том-как сериализовать мой класс Album public class Album...

Не работает сериализация
Пытаюсь разобратьс с реиализацией. Задача проста- созаетс фрейм в нем созаетс кнопка, котора добавлет текст. Далее все сохраняется. Должно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru