java 笔记 io流-3对象序列化
本帖最后由 可爱的静静 于 2017-9-1 01:43 编辑对象序列化对象序列化作用:把对象存到文件里,想用的时候可以读取ObjectOutputStream和ObiectInputStream是直接操作对象(对象当中会封装一些数据)的输入流和输出流,对象的持久化,可以长久存放数据的文件 ObjectOutputStream和ObiectInputStream是在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 voidWritePut(){
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 Contactimplements 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;
{:10_258:}假设已经把某类序例化了,如果某类改变了,id号就改变了,再次读取这个文件的时候就读取不了了,如果我们自己给这个类id号的话,修改了类之后id号不会改,修改之前保存的对象文件也就是可以读取了例如:刚刚已经对象序列话了,再来假设把成员name 访问方式改为public的话再读取这个文件的时候运行会有错误可以这样纸办:代码如下
import java.io.Serializable;
public class Contactimplements 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;
}
}
代码改完后,先对喜爱那个序列化,再改类的内容,在读取文件,运行结果如下:姓名小明,电话:123456789,email:1609368211@qq.com
其实就是加了个ID号 无论类的代码怎么改变也好,都可以读回之前的对象序列化文件
静态的成员,即使new了一个对象赋值了,序列化也不会有改变,如果不想对非静态的成员序列化的话,可以在成员变量前面加关键字transient例如:
代码还是上面那样,transientint phone 运行结果当然那就是没有phone的值没有改变
页:
[1]