首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java序列化

Java序列化
EN

Stack Overflow用户
提问于 2013-04-03 21:05:59
回答 7查看 4.8K关注 0票数 2

我现在正在学习如何使用Java语言进行序列化。我已经阅读了一些关于这个主题的帖子和文档,我试着做一个简单的例子(如下所示)

代码语言:javascript
复制
public class SterializeObject implements java.io.Serializable{

        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        private String name;
        private transient int code;

        public SterializeObject (String n, int c){
            name = n;
            code = c;
        }

        public void printAtributes (){
            System.out.println("name: " + name + "; code: " + code);
        }
    }

    public class MainClass {
        public static void main(String[] agrs) {
            SterializeObject ob1 = new SterializeObject("ana", 1);
            SterializeObject ob2 = new SterializeObject("rita", 2);

            try {
                FileOutputStream fileOut = new FileOutputStream("file.data");
                ObjectOutputStream outObj = new ObjectOutputStream(fileOut);
                outObj.writeObject(ob1);
                outObj.writeObject(ob2);
                outObj.close();
                System.out.println("Objects were serialized!");
            } catch (IOException e) {
                e.printStackTrace();
            }

            ArrayList<SterializeObject> list = new ArrayList<SterializeObject>();
            try {
                FileInputStream fileInput = new FileInputStream("file.data");
                ObjectInputStream inputObj = new ObjectInputStream(fileInput);
                Object o;
                try {
                    while ((o = inputObj.readObject()) != null) {
                        list.add((SterializeObject) o);
                    }
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    System.out.println("Erro foi aqui! (1)");
                }

                inputObj.close();
                fileInput.close();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("Erro foi aqui! (2)");
            }

            for (int i = 0; i < list.size(); ++i) {
                list.get(i).printAtributes();
            }
        }
    }

我创建了一个包含两个变量的代码:一个是string ( Class SterializeObject ),另一个是瞬态的int (代码)。然后,在主要部分,我生成了该类的两个实例,并尝试将其写入一个文件中,我已经成功地完成了!在此之后,我尝试使用循环读取两个对象。这就是我的问题。因为ObjectInputStream没有某种方法来判断我们是否结束了。所以,我试着处理这个条件:(o = inputObj.readObject()) != null

代码语言:javascript
复制
My output is this:
java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at MainClass.main(MainClass.java:30)
Objects were serialized!
Erro foi aqui! (2)
name: ana; code: 0
name: rita; code: 0

我得到了对象,但我得到了一个错误,因为,我认为,是试图访问不存在的东西。

有没有人能告诉我其他的方法?

诚挚的问候。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-04-03 21:09:53

读取与写入对象数量一样多的对象,或者写入对象列表本身,而不是一个接一个地写入每个对象。

(或者依靠EOFException来检测流的结束,但这很难看)。

票数 4
EN

Stack Overflow用户

发布于 2013-04-05 22:55:12

正如你们许多人告诉我的那样,我创建了一个ArrayList并序列化了ArrayList。我的代码是:

代码语言:javascript
复制
public class MainClass {
    public static void main(String[] agrs) {
        SterializeObject ob1 = new SterializeObject("ana", 1);
        SterializeObject ob2 = new SterializeObject("rita", 2);

        ArrayList <SterializeObject> list = new ArrayList<>();
        list.add(ob1);
        list.add(ob2);

        ArrayList <SterializeObject> input = new ArrayList<SterializeObject>();

        try {
            FileOutputStream fileOut = new FileOutputStream("file.data");
            ObjectOutputStream outObj = new ObjectOutputStream(fileOut);
            outObj.writeObject(list);
            outObj.close();
            System.out.println("Objects were serialized!");
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            FileInputStream fileInput = new FileInputStream("file.data");
            ObjectInputStream inputObj = new ObjectInputStream(fileInput);
            Object o;
            try {
                input = (ArrayList<SterializeObject>) inputObj.readObject();

            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("Erro foi aqui! (1)");
            }

            inputObj.close();
            fileInput.close();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Erro foi aqui! (2)");
        }

        for (int i = 0; i < input.size(); ++i) {
            input.get(i).printAtributes();
        }
    }
}

输出结果是:对象已序列化!名称: ana;编码:0名称: rita;编码:0

谢谢你的帮助!

票数 2
EN

Stack Overflow用户

发布于 2013-04-03 21:11:01

与ObjectOutputStream一起关闭FileOutputStream

代码语言:javascript
复制
fileOut.close();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15788182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档