鱼C论坛

 找回密码
 立即注册
查看: 2906|回复: 0

[学习笔记] java 笔记 io流-3对象序列化

[复制链接]
发表于 2017-8-31 23:54:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 可爱的静静 于 2017-9-1 01:43 编辑

对象序列化
对象序列化作用:把对象存到文件里,想用的时候可以读取
ObjectOutputStreamObiectInputStream是直接操作对象(对象当中会封装一些数据)的输入流和输出流,对象的持久化,可以长久存放数据的文件
ObjectOutputStreamObiectInputStream是在io包里面的


对象序列话和反序列话例子:
<div>     import java.io.*;</div><div>      public class xulie {</div><div>      public static void main(String[] args) {
      xulie a=new xulie();
         a.WritePut();
         a.read();</div><div>       }
 
        public void  WritePut(){
            try {
                   FileOutputStream out =new FileOutputStream("D://Student.dat");
                   ObjectOutputStream oos=new ObjectOutputStream(out);
                   Contact contact=new Contact("小明","123456789","1609368211@qq.com");
                    oos.writeObject(contact);
       oos.close();
       
           } catch (FileNotFoundException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
           } catch (IOException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
           }
        }
        public void read(){
         try {
    FileInputStream in=new FileInputStream("D://Student.dat");
    ObjectInputStream ois = null;
     ois = new ObjectInputStream(in);
    Contact contact = null;
     contact = (Contact)ois.readObject();
     System.out.println(contact);
    } catch (FileNotFoundException e) {
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (ClassNotFoundException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   
   }
        }
        }
</div></div>
import java.io.Serializable;
public class Contact  implements Serializable{

        private String name;
        private String phone;
        private String email;
        public Contact ( String name,String phone,String email){
                this.name=name;
                this.phone=phone;
                this.email=email;
        }
        public String toString()
        {
                return "姓名"+name+",电话:"+phone+",email:"+email;
        }
}
输出结果是:
姓名小明,电话:123456789,email:1609368211@qq.com

想要被序列化的例子必须是要有资格,只有类实现接口Serializable接口才会有资格,这个接口没有方法,只是标记这个对象可以序例化
如果每一次改变了类里面的内容,之前对象序列化的文件就没什么用,如果你重新建一个类,这就很麻烦了


怎样给这个标记可以序例化
其实就是给个类加了一个ID号,例如:static final long serialVersionUID = 42L;

假设已经把某类序例化了,如果某类改变了,
id号就改变了,再次读取这个文件的时候就读取不了了,如果我们自己给这个类id号的话,修改了类之后id号不会改,修改之前保存的对象文件也就是可以读取了
例如:刚刚已经对象序列话了,再来假设把成员name 访问方式改为public的话
再读取这个文件的时候运行会有错误
可以这样纸办:代码如下
[b]

import java.io.Serializable;
public class Contact  implements Serializable{

        static final long serialVersionUID = 42L;
        private String name;
        private String phone;
        private String email;
        public Contact ( String name,String phone,String email){
                this.name=name;
                this.phone=phone;
                this.email=email;
        }
        public String toString()
        {
                return "姓名"+name+",电话:"+phone+",email:"+email;
        }
}[/b]

代码改完后,先对喜爱那个序列化,再改类的内容,在读取文件,运行结果如下:
姓名小明,电话:123456789,email:1609368211@qq.com

其实就是加了个ID号 无论类的代码怎么改变也好,都可以读回之前的对象序列化文件


静态的成员,即使new了一个对象赋值了,序列化也不会有改变,如果不想对非静态的成员序列化的话,可以在成员变量前面加关键字transient
例如:

代码还是上面那样,transient  int phone
运行结果当然那就是没有phone的值没有改变

评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-20 22:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表