Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
antonboom
bmstu-team
301 / 136 / 56
Регистрация: 10.01.2012
Сообщений: 420
Записей в блоге: 10
#1

Не получается (де)сериализации класса - Программирование Android

28.07.2015, 22:57. Просмотров 410. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не получается (де)сериализации класса (Программирование Android):

Ошибка при сериализации массива boolean - Программирование Android
public static void writeToFile(boolean selex) { try { FileOutputStream fos = context.openFileOutput(&quot;selex.dat&quot;, ...

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

Атрибут при сериализации класса - C# ASP.NET
Добрый день. Есть xml который я хочу получить после сериализации класса public class Document { } &lt;Document...

.NET 4.x При сериализации класса, порой, меняется очерёдность полей в конечном XML файле - C#
Доброго времени суток. При сериализации класса, порой, меняется очерёдность полей в конечном xml файле. сериализую а-ля: ...

.NET 4.x Сохранение списка объектов класса в ручную, сохранение в XML. Без сериализации. - C#
Здравствуйте! Хотел спросить. Как можно сохранить список объектов в XML файл вручную? Я сериализацией делаю так: Класс, который будем...

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

6
Mikalai
256 / 232 / 94
Регистрация: 11.01.2015
Сообщений: 656
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 / 56
Регистрация: 10.01.2012
Сообщений: 420
Записей в блоге: 10
29.07.2015, 07:03  [ТС] #3
А если работать не с SecondClass, а с непустым ArrayList<SecondClass>, тоже работает?
0
PaDyra
32 / 32 / 8
Регистрация: 06.01.2012
Сообщений: 142
29.07.2015, 10:25 #4
Какая еще сериализация в Android? В Android есть Parcel и Parcelable, механизм, работающий намного быстрее сериализации Java. Ищите инфу и думаю ваша проблема решится.
0
Pablito
2477 / 1961 / 611
Регистрация: 12.05.2014
Сообщений: 6,866
Завершенные тесты: 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
221 / 221 / 23
Регистрация: 19.01.2013
Сообщений: 1,701
Записей в блоге: 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
2477 / 1961 / 611
Регистрация: 12.05.2014
Сообщений: 6,866
Завершенные тесты: 1
16.09.2015, 11:12 #7
после десериализации это уже разные объекты, через == уже не найдется
надо сравнивать по полям, либо переопределять в MyClass методs equals() и hashcode() (не уверен, что оба, но hashcode() точно)
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2015, 11:12
Привет! Вот еще темы с ответами:

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

не получается шаблон класса - Visual C++
Всем доброго времени суток. У меня такая проблема: Написал шаблон класса, но он не работает для типов double и float. Задача заключается...

Не получается создать массив класса - C++
#include &lt;iostream&gt; using namespace::std; class dvig { friend void sum_all(dvig &amp;,dvig &amp;); public: dvig(long double ,long...

Не получается вызвать метод класса - C++
Помогите найти ошибку в коде не могу вызвать тестовую (отладочную процедуру) вот скрин


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
16.09.2015, 11:12
Ответ Создать тему
Опции темы

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