Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
17 / 17 / 7
Регистрация: 05.09.2012
Сообщений: 246

Найти ошибку в коде с сериализацией/десериализацией

14.05.2014, 14:14. Показов 943. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста разобрать где ошибка.

Есть ArrayList который помещает в себя 256 JCheckBox- ов. Пользователь отмечает некоторые из них, и далее должен сохранить их в файл. Делатся ето должно с помощью FileOutputStream путём перевода ArrayList в обычный массив с последующей сериализацией этого массива. Потом должно происходить востановление в обратном порядке с заполнением на выведенных на экран CheckBox-ов согласно значений из файла. Но что-то не работает. Файл создаётся, но есть ли там массив - не ясно (подозреваю что нет). И при попытке десериализации ничего не происходит на экране, хотя указанный файл системой занят.

Клас MySendListener списывал из книги. Клас MyReceiveListener писал сам.
Подскажите пожалуйста где ошибка.

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
48
49
50
public class BeatBox implements Serializable {
    ArrayList<JCheckBox> checkBoxList;
 
    public static void main(String[] args) {
        new BeatBox().buildGUI();
    }
 
    public class MySendListener implements ActionListener {
 
        public void actionPerformed(ActionEvent a) {
            boolean[] checkboxState = new boolean[256];
            for (int i = 0; i < 256; i++) {
                JCheckBox check = (JCheckBox) checkBoxList.get(i);
                if (check.isSelected()) {
                    checkboxState[i] = true;
                }
            }
            try {
                FileOutputStream fileStream = new FileOutputStream("D:/Checkbox.ser");
                ObjectOutputStream os = new ObjectOutputStream(fileStream);
                os.writeObject(checkboxState);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    public class MyReceiveListener implements ActionListener {
 
        public void actionPerformed(ActionEvent a) {
            boolean [] checkBoxInList = new boolean [256];
            try {
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/Checkbox.ser"));
                checkBoxInList = (boolean []) (ois.readObject());
                
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            checkBoxList.clear();
            for (int i=0;i<256;i++) {
                JCheckBox inCheck = new JCheckBox();
                if (checkBoxInList[i]) {
                    inCheck.setSelected(true);
                } else {
                    inCheck.setSelected(false);
                }
                checkBoxList.add(inCheck);
            }
        }
    }
}
Добавлено через 13 минут
Дополню что в полном тексте содериться конечно же метод который создаёт все чекбоксы.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void buildGUI() {
        theFrame = new JFrame("Cyber BeatBox");
        theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        for (int i = 0; i < 256; i++) {
            JCheckBox c = new JCheckBox();
            c.setSelected(false);
            checkBoxList.add(c);
            mainPanel.add(c);
        }
        theFrame.add(mainPanel);
        theFrame.setBounds(50, 50, 300, 300);
        theFrame.pack();
        theFrame.setVisible(true);
    }
Добавлено через 30 минут
Если написать класс MyReceiveListener вот так, тогда работает, хотя не могу понять, как в ArrayList checkBoxList попали значения импортированного массива?.. Буду разбиратся...
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
public class MyReceiveListener implements ActionListener {
 
        public void actionPerformed(ActionEvent a) {
            boolean [] checkBoxInList = new boolean [256];
            try {
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File ("D:/Checkbox.ser")));
                checkBoxInList = (boolean []) (ois.readObject());
                
            } catch (Exception ex) {
                ex.printStackTrace();
            }
//            checkBoxList.clear();
            for (int i=0;i<256;i++) {
                JCheckBox inCheck = (JCheckBox) checkBoxList.get(i);
                if (checkBoxInList[i]) {
                    inCheck.setSelected(true);
                } else {
                    inCheck.setSelected(false);
                }
//                checkBoxList.add(inCheck);
            }
            sequencer.stop(); 
            buildTrackAndStart(); 
 
        }
    }
Добавлено через 4 часа 49 минут
Ребята, если можете разясните мне следующую часть кода. В ней то, что было написано мной и НЕ работает помечено комментарием. Не могу понять почемо оно не работает. В моём понимании при десериализации мы извлекаем массив из файла (приведя тип объекта к булевому массиву). Далее с помощью цикла for некоторому временному объекту inCheck класса JCheckBox inCheck присваиваем setSellected (true) если элемент массива true и добавляем етот объект в ArrayList checkBoxList (для объетов класса JCheckBox). Предварительно нужно бы этот ArrayList очистить, на случай если там уже имеются чекбоксы со значениями.
Но это не работает. Не понимаю почему.

С другой стороны, код где JCheckBox inCheck = (JCheckBox) checkBoxList.get(i); и без очистки аррейлист работает. И тоже не понимаю почему. Ведь JCheckBox inCheck = (JCheckBox) checkBoxList.get(i); как я его читаю значит присвоить объекту inCheck значение полученное из ArrayList checkBoxList под номером (i). Но как ети значения туда попадают, если мы их присваиваем только в условии if. И почему не очищаем ArrayList предварительно.
Вот текст цикла.
Java
1
2
3
4
5
6
7
8
9
10
11
//            checkBoxList.clear();
            for (int i=0;i<256;i++) {
//             JCheckBox inCheck = new  JCheckBox inCheck();
                JCheckBox inCheck = (JCheckBox) checkBoxList.get(i);
                if (checkBoxInList[i]) {
                    inCheck.setSelected(true);
                } else {
                    inCheck.setSelected(false);
                }
//                checkBoxList.add(inCheck);
            }
Вот на всякий случай текст метода, который строит новый трек из отмеченных чекбоксов если он нужен.
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
public void buildTrackAndStart() {
        int[] trackList = null;
 
        sequence.deleteTrack(track);
        track = sequence.createTrack();
 
        for (int i = 0; i < 16; i++) {
            trackList = new int[16];
 
            int key = instruments[i];
            for (int j = 0; j < 16; j++) {
                JCheckBox jc = (JCheckBox) checkBoxList.get(j + (16 * i));
                if (jc.isSelected()) {
                    trackList[j] = key;
                } else {
                    trackList[j] = 0;
                }
            }
            makeTracks(trackList);
            track.add(makeEvent(176, 1, 127, 0, 16));
        }
        track.add(makeEvent(192, 9, 1, 0, 15));
        try {
            sequencer.setSequence(sequence);
            sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
            sequencer.start();
            sequencer.setTempoInBPM(120);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Добавлено через 13 часов 20 минут
Ребята, объясните что не так читаю
Ребята, если можете разясните мне следующую часть кода. В ней то, что было написано мной и НЕ работает помечено комментарием. Не могу понять почемо оно не работает. В моём понимании при десериализации мы извлекаем массив из файла (приведя тип объекта к булевому массиву). Далее с помощью цикла for некоторому временному объекту inCheck класса JCheckBox inCheck присваиваем setSellected (true) если элемент массива true и добавляем етот объект в ArrayList checkBoxList (для объетов класса JCheckBox). Предварительно нужно бы этот ArrayList очистить, на случай если там уже имеются чекбоксы со значениями.
Но это не работает. Не понимаю почему.

С другой стороны, код где JCheckBox inCheck = (JCheckBox) checkBoxList.get(i); и без очистки аррейлист работает. И тоже не понимаю почему. Ведь JCheckBox inCheck = (JCheckBox) checkBoxList.get(i); как я его читаю значит присвоить объекту inCheck значение полученное из ArrayList checkBoxList под номером (i). Но как ети значения туда попадают, если мы их присваиваем только в условии if. И почему не очищаем ArrayList предварительно.
Вот текст цикла.
Java
1
2
3
4
5
6
7
8
9
10
11
//            checkBoxList.clear();
            for (int i=0;i<256;i++) {
//             JCheckBox inCheck = new  JCheckBox inCheck();
                JCheckBox inCheck = (JCheckBox) checkBoxList.get(i);
                if (checkBoxInList[i]) {
                    inCheck.setSelected(true);
                } else {
                    inCheck.setSelected(false);
                }
//                checkBoxList.add(inCheck);
            }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.05.2014, 14:14
Ответы с готовыми решениями:

Проблема с сериализацией и с десериализацией листа
Доброго времени суток у меня возникла такая вот проблема с сериализацией и с десериализацией листа Есть вот-такой код: using...

Двумерный массив. Поиск нулей.Не могу найти ошибку ошибку в коде
Вот,например массив 5 5 0 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 считываются два числа m и n и далее в выходной...

Найти сумму целых отрицательных чисел удовлетворяющих условию (найти и исправить ошибку в коде)
#include&lt;iostream&gt; #include&lt;math.h&gt; using namespace std; int main() { int y = 0; for(int i = -21; i &lt; -99; i+=3) ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2014, 14:14
Помогаю со студенческими работами здесь

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

Найти ошибку в коде
нужно найти суму двух матриц, тип элементов char import static java.lang.Math.random; public class nope { public static...

Найти ошибку в коде
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; //Çàïîëíåíèå ìàòðèöû void zap_a(double **a, int n, int m) { int...

Найти ошибку в коде)
Помогите найти ошибку в коде и исправить.Реализовать класс Payment (зарплата). В классе должны быть представлены поля:...

Найти ошибку в коде
Вот код, где ошибка? use Students_test if(object_id('dbo.tets2','V')is not null) dbop table...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru