黑马程序员---对象序列化

 
   ------- android培训java培训、期待与您交流! ----------
对象序列化:所谓对象序列化就是将对象的属性和方法,写入到硬盘中保存起来,进行持久化操作。(也就是将对象的状态转为字节流,以后通过反序列化的形式,通过这些值生成相同状态的对象。)
反序列:反序列化就是根据这些保存的信息重建对象的过程。
  对于这个,有几点我们需要明确:
          1.并非所有类都可以序列化,在cmd下,我们输入serialver java.net.socket,可以得到socket是否可序列化的信息,
          实际上socket是不可序列化的。
          2.java有很多基础类已经实现了serializable接口,比如string,vector等。但是比如hashtable就没有实现serializable接口。
             将对象读出或者写入流的主要类有两个: ObjectOutputStream与ObjectInputStream 。
            ObjectOutputStream 提供用来将对象写入输出流的writeObject方法,
            ObjectInputStream提供从输入流中读出对象的readObject方法。使用这些方法的对象必须已经被序列化的。
            也就是说,必须已经实现Serializable接口。

举个列子说明:
package IO;

import java.io.Serializable;

public class Animal implements Serializable{
    
/**
* 注意:如果这里在类的属性前面添加修饰符,比如 private  String  name;这样就会报错!!
* 为什么呢??因为该类序列化过后,会生成一个序列UID,UID的值是根据成员属性和方法来变化的,
* 所以这里添加修饰符过后,UID的值发生变化,导致反序列化读取时报错。
* 怎么保证UID值一致呢?   添加固定的UID值,static final long serialVersionUID = 42L;
*
*/
     static final long serialVersionUID = 42L;
     String  name;
     int age;
     static String country="cn";
     public  Animal(String name,int age,String country){
          this.name=name;
          this.age=age;
          this.country=country;
     }
     public String getName() {
          return name;
     }
     public void setName(String name) {
          this.name = name;
     }
     public int getAge() {
          return age;
     }
     public void setAge(int age) {
          this.age = age;
     }
   
}


  package IO;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializableDemo {
     public static void main(String[] args) throws Exception{
         // writeObj();
          readObj();
     }
     public  static void  writeObj() throws Exception{
          //利用ObjectOutputStream输出流 ,将animal对象 写入目的文件
          ObjectOutputStream  oos=new  ObjectOutputStream(new FileOutputStream("obj.txt"));
          oos.writeObject(new Animal("小花", 10,"美国"));//这里country属性的值,是不会发生改变的,始终都是cn,y因为country死静态变量
          oos.close();
     }
     public  static  void  readObj() throws Exception{
          //读取文件中的对象
          ObjectInputStream  ois=new ObjectInputStream(new FileInputStream("obj.txt"));
          Animal animal=  (Animal)ois.readObject();
          System.out.println(animal.getName()+"::"+animal.getAge());
     }    
}



   ------- android培训java培训、期待与您交流! ----------



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值