Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
antonboom
bmstu-team
301 / 136 / 91
Регистрация: 10.01.2012
Сообщений: 420
Записей в блоге: 10
#1

Не получается (де)сериализации класса

28.07.2015, 22:57. Просмотров 462. Ответов 6

Классы
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
public class FirstClass implements Serializable{
   String [поля];
   int [поля];
   public void Print(){...}
}
 
public class SecondClass implements Serializable {
   String [поля];
   int [поля];
   ArrayList<FirstClass> [поля];
   [несколько методов]
}

Сериализую ArrayList<SecondClass> в файл с помощью
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public void saveToFile(File file, Object value) throws Exception{
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(value);
        oos.flush();
        oos.close();
        fos.close();
    }
 
    public static Object loadFromFile(File file) throws Exception {
        Object result = null;
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        result = ois.readObject();
        ois.close();
        fis.close();
        return result;
    }


Но проходит, только если ArrayList пуст, если же в нем есть хоть один элемент, то ни save, ни load не проходят. Хотя при сериализации файл заполняется каким-то количеством байт.
В чем может быть причина? Логи показывают IOException у .write/read Object
Заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2015, 22:57
Ответы с готовыми решениями:

Ошибка при сериализации массива boolean
public static void writeToFile(boolean selex) { try { ...

Порядок сериализации класса
не пойму как сделать так чтобы поля прайват сериализовались раньше полей...

Атрибут при сериализации класса
Добрый день. Есть xml который я хочу получить после сериализации класса ...

Комментарии при сериализации класса в xml
Здравствуйте. Вот я делаю серилизацию таким образом public bool...

При сериализации класса, порой, меняется очерёдность полей в конечном XML файле
Доброго времени суток. При сериализации класса, порой, меняется очерёдность...

6
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 670
28.07.2015, 23:50 #2
Если просто на java писать, то работает:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package mPackage;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
 
public class First {
    public static void main(String[] args){
        First first = new First();
        
        ArrayList<FirstClass> list = new ArrayList<>();
        list.add(new FirstClass(1));
        list.add(new FirstClass(2));
        list.add(new FirstClass(3));
        list.add(new FirstClass(4));
        //...
        
        SecondClass value = new SecondClass(list);
        
        File file = new File("MySerializable");
        //write
        try {
            first.saveToFile(file, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        //read
        SecondClass bingo = null;
        try {
            bingo = (SecondClass) first.loadFromFile(file);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        bingo.print();
    }
    
    public void saveToFile(File file, Object value) throws Exception{
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(value);
        oos.flush();
        oos.close();
        fos.close();
    }
 
    public Object loadFromFile(File file) throws Exception {
        Object result = null;
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        result = ois.readObject();
        ois.close();
        fis.close();
        return result;
    }
} 
 
class FirstClass implements Serializable{
       String str = "FirstClass";
       int x;
       public FirstClass(int x) {
           this.x = x;
       }
       public void print(){
           System.out.println(str + x);
       }
}
     
class SecondClass implements Serializable {
       String str = "SecondClass";;
       int y = 2;
       ArrayList<FirstClass> list;
       public SecondClass(ArrayList<FirstClass> list) {
           this.list = list;
       }
       public void print(){
           for(FirstClass item: list) item.print();
       }
}
1
antonboom
bmstu-team
301 / 136 / 91
Регистрация: 10.01.2012
Сообщений: 420
Записей в блоге: 10
29.07.2015, 07:03  [ТС] #3
А если работать не с SecondClass, а с непустым ArrayList<SecondClass>, тоже работает?
0
PaDyra
32 / 32 / 25
Регистрация: 06.01.2012
Сообщений: 142
29.07.2015, 10:25 #4
Какая еще сериализация в Android? В Android есть Parcel и Parcelable, механизм, работающий намного быстрее сериализации Java. Ищите инфу и думаю ваша проблема решится.
0
Pablito
2708 / 2155 / 731
Регистрация: 12.05.2014
Сообщений: 7,521
Завершенные тесты: 1
29.07.2015, 10:36 #5
сам пользуюсь вот такими двумя методами для де/сериализации
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
private void serializeObject(String name, Object object) {
        try {
            FileOutputStream fos = openFileOutput(name, Context.MODE_PRIVATE);
            ObjectOutputStream os = new ObjectOutputStream(fos);
            os.writeObject(object);
            os.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    private Object loadObject(String name) {
        Object object = null;
        try {
            FileInputStream fis = openFileInput(name);
            ObjectInputStream is = new ObjectInputStream(fis);
            object = is.readObject();
            is.close();
            fis.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return object;
    }
тс, не слушай кто говорит что Parсelable намного быстрее, там прирост с гулькин хвост и то на больших объемах данных, а гимора в разы больше
2
ILNAR_93
Android
237 / 237 / 49
Регистрация: 19.01.2013
Сообщений: 1,876
Записей в блоге: 3
16.09.2015, 11:02 #6
Паблито,

Почему то не удаляет Item
Java
1
2
3
4
5
6
7
8
MyClass My = new MyClass(params) ;
 ArrayList<MyClass> Temp = (ArrayList<MyClass>) new ObjectSerializer().loadObject("FILE", ctx);
 
            if (Temp!=null){
 
                Temp.remove(My);
               
            }
0
Pablito
2708 / 2155 / 731
Регистрация: 12.05.2014
Сообщений: 7,521
Завершенные тесты: 1
16.09.2015, 11:12 #7
после десериализации это уже разные объекты, через == уже не найдется
надо сравнивать по полям, либо переопределять в MyClass методs equals() и hashcode() (не уверен, что оба, но hashcode() точно)
1
16.09.2015, 11:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2015, 11:12

Сохранение списка объектов класса в ручную, сохранение в XML. Без сериализации.
Здравствуйте! Хотел спросить. Как можно сохранить список объектов в XML файл...

При перегрузке оператора для класса не получается использовать имя переменной такое же, как в описании класса
Описал первый класс,затем - описал второй класс, используя первый,и когда начал...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru