对象的序列化异常及从文件里反序列化多个对象

对象的序列化异常及从文件里反序列化多个对象

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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Comparator;
import java.util.InputMismatchException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
 
public class LinkedListDemo implements Serializable{
    private List<StuGrade> list;
 
    public List<StuGrade> getList() {
        return list;
    }
 
    public void setList(List<StuGrade> list) {
        this.list = list;
    }
 
    public LinkedListDemo() {
        list = new LinkedList<StuGrade>();
    }
 
    Scanner sc = new Scanner(System.in);
 
    // 1.用户从界面输入学生成绩
    public void InputGrade(StuGrade sg) {
float a1,a2,a3,a4=0;
        System.out.println("姓名");
        sg.setName(sc.next());
        boolean flag;
        a1 = a2 = a3 = a4 = 0;
        String b = null;
        System.out.println("请输入相应成绩(满分为100)");
        do {
            flag = true;
            try {
                if (a1 == 0) {
                    System.out.print("语文成绩:");
                    a1 = sc.nextFloat();
                }
                if(a1 < 0 || a1 >100) {
                    throw new Grade1();
                }
            catch(Grade1 e) {
                System.out.println(e.getMessage());
                a1 = 0;
                flag = false;
                continue;
            }catch (InputMismatchException e) {
                // TODO: handle exception
                System.out.println("请勿输入除0-100外的其他字符");
                b = sc.next();
                flag = false;
                continue;
            }
 
            try {
                if (a2 == 0) {
                    System.out.print("数学成绩:");
                    a2 = sc.nextFloat();
                }
                if(a2 < 0 || a2 >100) {
                    throw new Grade1();
                }
            catch(Grade1 e) {
                System.out.println(e.getMessage());
                a2 = 0;
                flag = false;
                continue;
            }catch (InputMismatchException e) {
                // TODO: handle exception
                System.out.println("请勿输入除0-100外的其他字符");
                b = sc.next();
                flag = false;
                continue;
            }
 
            try {
                if (a3 == 0) {
                    System.out.print("英语成绩:");
                    a3 = sc.nextFloat();
                }
                if(a3 < 0 || a3 >100) {
                    throw new Grade1();
                }
            catch(Grade1 e) {
                System.out.println(e.getMessage());
                a3 = 0;
                flag = false;
                continue;
            }catch (InputMismatchException e) {
                // TODO: handle exception
                System.out.println("请勿输入除0-100外的其他字符");
                b = sc.next();
                flag = false;
                continue;
            }
            try {
                if (a4 == 0) {
                    System.out.print("Java成绩:");
                    a4 = sc.nextFloat();
                }
                if(a4 < 0 || a4 >100) {
                    throw new Grade1();
                }
            catch(Grade1 e) {
                System.out.println(e.getMessage());
                a4 = 0;
                flag = false;
                continue;
            }catch (InputMismatchException e) {
                // TODO: handle exception
                System.out.println("请勿输入除0-100外的其他字符");
                b = sc.next();
                flag = false;
                continue;
            }
        while (!flag);
 
        sg.setChinese(a1);
        sg.setMath(a2);
        sg.setEnglish(a3);
        sg.setJava(a4);
        this.getList().add(sg);
    }
 
    // 2.显示学生信息
    public void display() {
        System.out.println("以下是学生成绩信息:");
        Iterator<StuGrade> it = this.getList().iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
 
    // 用户可以自定义设置权值
    public void weighted() {
        System.out.println("是否更改默认权值(科目权值均为0.25)");
        System.out.println("1.是");
        System.out.println("2.否");
        int n = sc.nextInt();
        float a1, a2, a3, a4;
        a1 = a2 = a3 = a4 = 0.25f;
        switch (n) {
        case 2:
            break;
        case 1:
            boolean flag;
            a1 = a2 = a3 = a4 = 0;
            String b = null;
            System.out.println("请为每一项成绩设置加权值(总权值不超过1)");
            do {
                flag = true;
                try {
                    if (a1 == 0) {
                        System.out.print("语文加权值:");
                        a1 = sc.nextFloat();
                    }
                catch (InputMismatchException e) {
                    // TODO: handle exception
                    System.out.println("请勿输入除0-1外的其他字符");
                    b = sc.next();
                    flag = false;
                    continue;
                }
 
                try {
                    if (a2 == 0) {
                        System.out.print("数学加权值:");
                        a2 = sc.nextFloat();
                    }
                catch (InputMismatchException e) {
                    // TODO: handle exception
                    System.out.println("请勿输入除0-1外的其他字符");
                    b = sc.next();
                    flag = false;
                    continue;
                }
 
                try {
                    if (a3 == 0) {
                        System.out.print("英语加权值:");
                        a3 = sc.nextFloat();
                    }
                catch (InputMismatchException e) {
                    // TODO: handle exception
                    System.out.println("请勿输入除0-1外的其他字符");
                    b = sc.next();
                    flag = false;
                    continue;
                }
 
                try {
                    if (a4 == 0) {
                        System.out.print("Java加权值:");
                        a4 = sc.nextFloat();
                    }
                catch (InputMismatchException e) {
                    // TODO: handle exception
                    System.out.println("请勿输入除0-1外的其他字符");
                    b = sc.next();
                    flag = false;
                    continue;
                }
 
                try {
                    if ((a1 + a2 + a3 + a4) != 1) {
                        throw new weighted1();
                    }
                catch(weighted1 e) {
                    System.out.println(e.getMessage());
                    a1 = a2 = a3 = a4 = 0;
                    flag = false;
                    continue;
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            while (!flag);
            break;
        }
        Iterator<StuGrade> it = this.getList().iterator();
        while (it.hasNext()) {
            StuGrade sg = it.next();
            sg.setAve(a1 * sg.getChinese() + a2 * sg.getMath() + a3 * sg.getEnglish() + a4 * sg.getJava());
        }
    }
 
    // 3.升序排列
    class Ascending implements Comparator<StuGrade> {
        @Override
        public int compare(StuGrade o1, StuGrade o2) {
            // TODO Auto-generated method stub
            return new Float(o1.getAve()).compareTo(new Float(o2.getAve()));
        }
    }
 
    // 4.降序排列
    class Descending implements Comparator<StuGrade> {
        @Override
        public int compare(StuGrade o1, StuGrade o2) {
            // TODO Auto-generated method stub
            return new Float(o2.getAve()).compareTo(new Float(o1.getAve()));
        }
    }
 
    // 5.导入学生成绩文件
    public void InputFile() {
        // 读取
        Scanner input = null;
        try {
            FileInputStream fis = new FileInputStream("chengji.txt");
            InputStreamReader isr = new InputStreamReader(fis);
            input = new Scanner(fis, "GBK");
        catch (FileNotFoundException e) {
            // TODO: handle exception
            System.out.println("此文件不存在");
        catch (IOException e) {
            // TODO: handle exception
            e.printStackTrace();
        }
 
        while (input.hasNext()) {
            for (int i = 0; i < 3; i++) {
                StuGrade sg = new StuGrade();
                sg.setName(input.next());
                sg.setChinese(input.nextFloat());
                sg.setMath(input.nextFloat());
                sg.setEnglish(input.nextFloat());
                sg.setJava(input.nextFloat());
                this.getList().add(sg);
            }
        }
        System.out.println("txt 内容:");
        this.display();
    }
 
    // 6.将学生成绩导出到ave.txt文件
    public void OutputFile() {
        try {
            FileOutputStream fos = new FileOutputStream("ave.txt");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
System.out.println(this);
            oos.writeObject(this);
                oos.flush();
                fos.close();
                oos.close();
             
        catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 
         
 
    // 7.将文件内容反序列化
    public void InputObject() {
        try {
            FileInputStream fis = new FileInputStream("ave.txt");
            ObjectInputStream ois = new ObjectInputStream(fis);
            // 怎么将文件里的多个对象反序列化输出?不知道怎么写循环诶
//          LinkedListDemo lld1 = (LinkedListDemo) ois.readObject();
            List lld1 = (LinkedList) ois.readObject();
            Iterator<StuGrade> it = lld1.iterator();
            while(it.hasNext()) {
                System.out.println(it.next());
                 
            }
        catch (Exception e) {
            // TODO: handle exception
        }
        System.out.println("反序列化成功!");
 
    }
 
}

这是我LinkedListDemo类的全部代码,刚刚输出了this 里面确实没有东西。

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

你往里写的时候是一个List的对象,读的时候还是读一个List对象。这个要统一,参看26行和39行。你看一下你的代码是不是不统一了呢。另我输入的有中文输出的还是中文这个没有问题的呀,中间的过程如ave.txt文件你不用管的。

http://img1.sycdn.imooc.com/climg//59c2162e00018a9807850905.jpg

  • 櫻絳_ 提问者 #1
    谢谢,我确实没有序列化。 我先将文件里的信息导入,构成了链表,在排序后,将成绩导入文件,然后反序列化输出。 但是依然什么也没有输出,也没有报错。 我将修改后的代码放在最上面了,重新编辑了问题,请助教往上看~
    2017-09-20 15:50:08
  • 好帮手慕雪 回复 提问者 櫻絳_ #2
    oos.writeObject(this);中的this是什么?是LinkedList<StuGrade>吗?你先在它的上面输出一下this,是不是它没有内容呢?
    2017-09-20 16:03:25
  • 櫻絳_ 提问者 回复 好帮手慕雪 #3
    嗯嗯 刚刚输出了里面确实没有东西。但this不就是指当前实例化的LinkedList吗? 我又重新编辑了问题,贴出了我的LinkedListDemo里的全部代码。 谢谢助教的耐心~
    2017-09-20 16:12:16
提问者 櫻絳_ 2017-09-20 13:45:17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 7.将文件内容反序列化
public void InputObject() {
    try {
        FileInputStream fis = new FileInputStream("ave.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        // 怎么将文件里的多个对象反序列化输出?不知道怎么写循环诶
        LinkedListDemo lld1 = (LinkedListDemo) ois.readObject();
        System.out.println(lld1);
        Iterator<StuGrade> it = lld1.getList().iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
             
        }
    catch (Exception e) {
        // TODO: handle exception
    }
    System.out.println("反序列化成功!");
 
}

问题一:先反序列化了LinkedList 再循环输出,但只输出了“反序列化成功”几个字,中间没有任何的输出结果,也没有报错。请问我该怎么改呢?

问题二:方法6导出文件,查看了writeUTF()只能传入字符串 却不能传入对象。而且我想输出中文,应该用GBK 但是API里没有给出相应的方法。

*************************************************************************************************

上题的问题一已解决,是因为括号位置打错了,才发现,谢谢助教~

好帮手慕雪 2017-09-19 20:02:00

1)FileOutputStream没有writeBytes()这个方法。你在代码中却用了。有write(传byte数组)。2)ObjectOutputStream可以有writeUTF(name);   3)将若干个对象都装入一个容器中(如:ArrayList之类),然后将容器这一个对象写入就行了。读取时,只要读取一个对象(即容器对象)就行了。然后遍历得到所有的对象。作业中如果有疑问,可在问答区进行提问,我们的助教老师会帮您答疑解惑,祝学习愉快!

  • 提问者 櫻絳_ #1
    助教,请看一下楼上,还存在问题。谢谢
    2017-09-20 13:45:57
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码