-1 / 1 / 0
Регистрация: 20.12.2012
Сообщений: 47
1

Десериализация Java

08.10.2013, 20:02. Показов 2187. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, как сделать десериализацию (воспроизвести содержимое файла)?. В интернете находил 2 способа, но они не работают или я что-то не дописал.
В C# все просто:
C#
1
2
3
4
5
//Десериализация 
            FileStream f1 = new FileStream("file.txt", FileMode.Open);
            BinaryFormatter b1 = new BinaryFormatter();
            LinkedList<Person> list1 = (LinkedList<Person>)b1.Deserialize(f1);
            f1.Close();
Код 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
public static void main(String[] args) throws FileNotFoundException, IOException 
    {
        LinkedList <Person> array = new LinkedList<Person>();
        //polymorphic object (print)
        System.out.println("PRINT POLYMORPHIC OBJECTS :");
            Person prs;
            prs = new Person("Anton", 1);
            prs.show();
            Working wrk;
            wrk = new Working("Nikita",2,22);
            wrk.show();
            Engineer eng;
            eng = new Engineer("Sergey", 3, 33);
            eng.show();
            Administrator adm;
            adm = new Administrator("Alexander", 4, 44);
            adm.show();
            
         //create and print object linkedlist
         System.out.println("\n\nCREATE AND PRINT LINKEDLIST:");
            array.addLast(prs);
            array.addLast(wrk);
            array.addLast(eng);
            array.addLast(adm);
        for(Person item: array) item.show();
        
        
        
        //Seriazable
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(array);
        
        
        array.clear();
        
 
 
/*
        //Deseriazable
        ByteArrayInputStream bis = new ByteArrayInputStream(serialized);
        ObjectInputStream ois = new ObjectInputStream(bis);
        LinkedList<Person> array1 = (LinkedList<Person>) ois.readObject();
        
        
        
        
        
        
        
         //Seriazable    
         FileOutputStream fos = new FileOutputStream("file.txt");
         ObjectOutputStream oos = new ObjectOutputStream(fos);
         TestSerial ts = new TestSerial();
         oos.writeObject(ts);
         oos.flush();
         oos.close();
    
         array.clear();
 
         
         
         //Desiarizable
         FileInputStream fis = new FileInputStream("file.txt");
         ObjectInputStream oin = new ObjectInputStream(fis);
         TestSerial ts = (TestSerial) oin.readObject();
         System.out.println("version="+ts.version);
        */ 
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2013, 20:02
Ответы с готовыми решениями:

десериализация файла
Здравствуйте. Пытаюсь сделать десериализацию текстового файла, который прежде был сериализирован....

Десериализация и вывод
Возникла дилемма: сериализую объект, размер файла увеличивается, после десериализации пытаюсь...

Десериализация не получается
Помогите советом пожалуйста. Выкидывает exception. Десериализуеться только 1 объект вот код ...

Десериализация .ser
Есть файл .ser, выдернутый из .jar архива. Есть варианты как просматреть в читаемом формате, что...

19
Кандёхаем веселее!
296 / 328 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
09.10.2013, 02:13 2
Как вариант, можно сделать класс-контейнер(implements Serializable) для списка, и сохранять его.
0
-1 / 1 / 0
Регистрация: 20.12.2012
Сообщений: 47
09.10.2013, 10:33  [ТС] 3
Я единственное не могу понят, почему не работает:
Java
1
2
3
//Deseriazable
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));
        Person prsn = (Person)ois.readObject();
Если это разрешить, то я дальше сам.
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
09.10.2013, 10:43 4
Цитата Сообщение от bestpalyer1 Посмотреть сообщение
Я единственное не могу понят, почему не работает:
У меня работает.
0
-1 / 1 / 0
Регистрация: 20.12.2012
Сообщений: 47
09.10.2013, 11:17  [ТС] 5
Цитата Сообщение от Skipy Посмотреть сообщение
У меня работает.
Попробуйте запустить у себя:
Кликните здесь для просмотра всего текста

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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package лабораторная.работа.pkg5;
 
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.LinkedList;
 
/**
 *
 * @author Никита Галкин
 */
public class ЛабораторнаяРабота5  implements Serializable
{
         abstract class Abs implements Serializable
    {
        abstract public void show();
    }
 
    static class Person extends Abs implements Serializable
    {
        public String name;
        public int age;
        public Person(String NewName, int NewAge) { super(); this.name = NewName; this.age = NewAge; }
        public Person() { }
        @Override
        public void show() { System.out.println("Name-" + name + " Age-" + age); }
    }
 
    static class Working extends Person implements Serializable
    {
        public int salary;        
        public Working(String NewName, int NewAge, int NewSalary)
        { super();this.age = NewAge; this.name = NewName; this.salary = NewSalary; };
        
        @Override
        public void show() { System.out.println("Name-" + name + " Age-" + age + " Salary-" + salary); }
    }
 
    static class Engineer extends Person implements Serializable
    {
        public int level;
 
        public Engineer(String NewName, int NewAge, int NewWshop)
        { super(); this.name = NewName; this.age = NewAge; this.level = NewWshop; }
        @Override
        public void show() { System.out.println("Name-" + name + " Age- " + age + " Level-" + level); }
    }
 
    static class Administrator extends Person implements Serializable
    {
        public int rang;
 
        public Administrator(String NewName, int NewAge, int NewRaz)
        { super();this.name = NewName; this.age = NewAge; this.rang = NewRaz; }
        @Override
        public void show() { System.out.println("Name-" + name + " Age-" + age + " Rang-" + rang); }
    }
   
   
    
    
    public static void main(String[] args) throws  IOException 
    {    
        LinkedList <Person> array = new LinkedList<Person>();
        //polymorphic object (print)
        System.out.println("PRINT POLYMORPHIC OBJECTS :");
            Person prs;
            prs = new Person("Anton", 1);
            prs.show();
            Working wrk;
            wrk = new Working("Nikita",2,22);
            wrk.show();
            Engineer eng;
            eng = new Engineer("Sergey", 3, 33);
            eng.show();
            Administrator adm;
            adm = new Administrator("Alexander", 4, 44);
            adm.show();
            
         //create and print object linkedlist
         System.out.println("\n\nCREATE AND PRINT LINKEDLIST:");
            array.addLast(prs);
            array.addLast(wrk);
            array.addLast(eng);
            array.addLast(adm);
        for(Person item: array) item.show();
        
        //Seriazable
        FileOutputStream fos  = new FileOutputStream("test.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        for(Person item: array) oos.writeObject(item);
        oos.flush();
        oos.close();
        
        array.clear();
        
        //Deseriazable
         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));
         LinkedList<Person> arr = (LinkedList <Person>)ois.readObject(); 
      
        /* OR
        //Deseriazable
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));
        Person prsn = (Person)ois.readObject();
        */
    }
}
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
09.10.2013, 12:02 6
Цитата Сообщение от bestpalyer1 Посмотреть сообщение
Попробуйте запустить у себя:
Даже пробовать не буду. Код содержит очевидные ошибки. Сериализация не совпадает с десериализациецй.
0
-1 / 1 / 0
Регистрация: 20.12.2012
Сообщений: 47
09.10.2013, 12:26  [ТС] 7
Цитата Сообщение от Skipy Посмотреть сообщение
Даже пробовать не буду. Код содержит очевидные ошибки. Сериализация не совпадает с десериализациецй.
Я java изучать начал неделю назад! И не надо писать "код содержит очевидные ошибки". Вы бы лучше помогли разобраться.
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
09.10.2013, 13:26 8
А что там разбираться? Вы сериализуете несколько объектов типа Person. На каком основании Вы после этого десериализуете один объект типа LinkedList?
0
-1 / 1 / 0
Регистрация: 20.12.2012
Сообщений: 47
09.10.2013, 13:48  [ТС] 9
Цитата Сообщение от Skipy Посмотреть сообщение
А что там разбираться? Вы сериализуете несколько объектов типа Person. На каком основании Вы после этого десериализуете один объект типа LinkedList?
Я понял о чем вы, но все равно ошибка происходит:
Java
1
2
3
4
5
6
7
8
9
10
11
12
//Seriazable
        FileOutputStream fos  = new FileOutputStream("test.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(array);
        oos.flush();
        oos.close();
        
        array.clear();
        
        //Deseriazable
         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));
         LinkedList<Person> arr = (LinkedList <Person>)ois.readObject(); //ПОСЛЕ ОШИБКИ ПОДЧЕРКИВАЕТ ДАННУЮ СТРОКУ
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
09.10.2013, 14:42 10
Цитата Сообщение от bestpalyer1 Посмотреть сообщение
Я понял о чем вы, но все равно ошибка происходит:
)))) - напомнило мультик про гомера и lie detector http://www.youtube.com/watch?v=sWXGEia01fE

Java
1
2
3
4
5
6
//Deseriazable
         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));
         LinkedList<Person> arr = new LinkedList<>();
while((Object o = ois.readObject())!= null)
arr.add((Person) o);
}
1
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
09.10.2013, 14:43 11
КАКАЯ ошибка? Думаете, она тут одна может быть?
0
-1 / 1 / 0
Регистрация: 20.12.2012
Сообщений: 47
09.10.2013, 15:37  [ТС] 12
Цитата Сообщение от mutagen Посмотреть сообщение
)))) - напомнило мультик про гомера и lie detector http://www.youtube.com/watch?v=sWXGEia01fE

Java
1
2
3
4
5
6
//Deseriazable
         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));
         LinkedList<Person> arr = new LinkedList<>();
while((Object o = ois.readObject())!= null)
arr.add((Person) o);
}

Спасибо, но при добавлении происходит ошибка:
Java
1
arr.add((Person) o);
Ошибка: Exception in thread "main" java.lang.ClassCastException: java.util.LinkedList cannot be cast to лабораторная.работа.pkg5.Работа$Person
at работа.Работа.main(
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
09.10.2013, 15:48 13
Перевожу с английского. Дорого.

Ошибка приведения типа: LinkedList не может быть приведен к типу Person.

Объясняю происходящее. Бесценно.

Вы записали LinkedList, потом его считали, а потом хотите привести к типу Person и положить в коллекцию.

Резюме. Вы определитесь, что Вы пишете - объекты по отдельности или коллекцию. И в соответствии с этим читайте - объекты по отдельности или коллекцию соответственно. Сейчас Вы делаете ровно наоборот - пишете объекты и читаете коллекцию, либо пишете коллекцию и читаете объекты.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
09.10.2013, 15:52 14
Блин я под столом, сначала ТС писал персоны, а читал лист, я ему исправил на чтение персон, так он стал теперь писать лист и читать персоны ))))) Гомер тут просто отдыхает ))))))
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
09.10.2013, 17:18 15
Цитата Сообщение от mutagen Посмотреть сообщение
Java
1
while((Object o = ois.readObject())!= null)
А не исключение будет при попытке чтения несуществующего объекта? Что-то мне кажется, что это один из немногих случаев, когда будет EOFException.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
09.10.2013, 17:41 16
Цитата Сообщение от Skipy Посмотреть сообщение
А не исключение будет при попытке чтения несуществующего объекта?
да - верно подмечено, исправляемся )
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
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.LinkedList;
import java.util.List;
 
/**
 *
 * @author mutagen
 */
public class Sertst {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        List<Prod> pList = new LinkedList<>();
        for (int i = 0; i < 10; i++) {
            pList.add(new Prod("name_" + i));
        }
 
        File f = new File("ser.txt");
 
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
 
        for (Prod prod : pList) {
            oos.writeObject(prod);
        }
        oos.flush();
        oos.close();
 
 
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
 
        List<Prod> pListDeser = new LinkedList<>();
        try {
            while (true) {
                pListDeser.add((Prod) ois.readObject());
            }
        } catch (Exception e) {
        } finally {
            ois.close();
        }
 
 
        System.out.println(pListDeser);
 
    }
 
    static class Prod implements Serializable {
 
        private String name;
 
        public Prod(String name) {
            this.name = name;
        }
 
        @Override
        public String toString() {
            return "Prod{" + "name=" + name + '}';
        }
    }
}
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
09.10.2013, 18:21 17
Исключение ловить неспортивно. Лучше в поток в начале записать количество объектов через writeInt. Тогда при чтении сначала читается int и потом соответствующее ему количество объектов.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
09.10.2013, 18:30 18
Цитата Сообщение от Skipy Посмотреть сообщение
Лучше в поток в начале записать количество объектов через writeInt.
так это уже целый протокол сериализации ваять
0
-1 / 1 / 0
Регистрация: 20.12.2012
Сообщений: 47
09.10.2013, 20:08  [ТС] 19
Ребят, у меня все получилось, я понял теперь. Я очень не люблю критику, особенно в грубой форме, но все же СПАСИБО.
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
10.10.2013, 11:00 20
Цитата Сообщение от bestpalyer1 Посмотреть сообщение
Я очень не люблю критику, особенно в грубой форме, но все же СПАСИБО.
Я Вам один умный вещь скажу, но Вы не обижайтесь. Это была мягкая форма критики. Вы не видели грубой.

P.S. Привыкайте к критике, если хотите развиваться.
0
10.10.2013, 11:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2013, 11:00
Помогаю со студенческими работами здесь

Десериализация XML
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;response list=&quot;true&quot;&gt; &lt;user&gt; &lt;id&gt;205387401&lt;/id&gt; ...

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

Десериализация как метод класса
Пытаюсь сделать сериализацию и десериализацию как метод класса. С сериализацией все получилось...

Gson десериализация объекта в объекте
Всем привет, не могу сообразить как сделать... есть класс: public class Message { private...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru