鱼C论坛

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

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

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

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

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

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

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


对象序列话和反序列话例子:
  1. <div>     import java.io.*;</div><div>      public class xulie {</div><div>      public static void main(String[] args) {
  2.       xulie a=new xulie();
  3.          a.WritePut();
  4.          a.read();</div><div>       }

  5.         public void  WritePut(){
  6.             try {
  7.                    FileOutputStream out =new FileOutputStream("D://Student.dat");
  8.                    ObjectOutputStream oos=new ObjectOutputStream(out);
  9.                    Contact contact=new Contact("小明","123456789","1609368211@qq.com");
  10.                     oos.writeObject(contact);
  11.        oos.close();
  12.       
  13.            } catch (FileNotFoundException e) {
  14.                    // TODO Auto-generated catch block
  15.                    e.printStackTrace();
  16.            } catch (IOException e) {
  17.                    // TODO Auto-generated catch block
  18.                    e.printStackTrace();
  19.            }
  20.         }
  21.         public void read(){
  22.          try {
  23.     FileInputStream in=new FileInputStream("D://Student.dat");
  24.     ObjectInputStream ois = null;
  25.      ois = new ObjectInputStream(in);
  26.     Contact contact = null;
  27.      contact = (Contact)ois.readObject();
  28.      System.out.println(contact);
  29.     } catch (FileNotFoundException e) {
  30.      e.printStackTrace();
  31.     } catch (IOException e) {
  32.      // TODO Auto-generated catch block
  33.      e.printStackTrace();
  34.     } catch (ClassNotFoundException e) {
  35.      // TODO Auto-generated catch block
  36.      e.printStackTrace();
  37.    
  38.    }
  39.         }
  40.         }
  41. </div></div>
复制代码

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

  3.         private String name;
  4.         private String phone;
  5.         private String email;
  6.         public Contact ( String name,String phone,String email){
  7.                 this.name=name;
  8.                 this.phone=phone;
  9.                 this.email=email;
  10.         }
  11.         public String toString()
  12.         {
  13.                 return "姓名"+name+",电话:"+phone+",email:"+email;
  14.         }
  15. }
复制代码
输出结果是:
姓名小明,电话:123456789,email:1609368211@qq.com

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


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

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

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

  4.         static final long serialVersionUID = 42L;
  5.         private String name;
  6.         private String phone;
  7.         private String email;
  8.         public Contact ( String name,String phone,String email){
  9.                 this.name=name;
  10.                 this.phone=phone;
  11.                 this.email=email;
  12.         }
  13.         public String toString()
  14.         {
  15.                 return "姓名"+name+",电话:"+phone+",email:"+email;
  16.         }
  17. }[/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-4-20 09:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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