现象:
java序列化
我们有时候要将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,java虚拟机本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。
方法:
一:没有实现Serializable接口的时候序列化java类
1:需要被序列化的Student类如果没有实现Serializable接口
2:java序列化方法
3:没有实现序列化接口将抛出异常
二:java类实现Serializable接口
1:Student类实现Serializable接口继续使用上面序列化的方法
2:序列化操作完成
3:java对象创建的序列化文件生成在指定的文件里面
三:反序列化操作将序列化话文件反序列化成Java对象
1:反序列化对象的方法
2:反序列化输出java对象的结果
3:标识未被序列化的属性
其中反序列化对象的时候 sex值为null 是因为在序列化操作中sex设置为transient 短暂属性没有被序列化,所以放序列化的时候值为null,其中如果值为int类型设置为短暂 反序列化则为0
代码:
/**
* 学生类:序列化使用的类
* @author Administrator
*/
class Students implements Serializable{
private String name;
private int age;
private transient String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
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;
}
@Override
public String toString() {
return "Students [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}
/**
* 反序列化对象
*/
public static void serializeable(){
Students s=null;
FileInputStream fis=null;
ObjectInputStream in=null;
try {
fis = new FileInputStream("F:/xuliehua/xuliehua.ser");
try {
in = new ObjectInputStream(fis);
try {
s = (Students) in.readObject();
System.out.println("反序列化对象成功:"+s.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
try {
if(fis!=null){
fis.close();
}
if(in!=null){
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 序列化操作方法
*/
public static void serializableObject(){
Students s=new Students();
s.setName("zhangsan");
s.setAge(25);
s.setSex("男");
FileOutputStream fos=null;
ObjectOutputStream out =null;
try {
fos = new FileOutputStream("F:/xuliehua/xuliehua.ser");
try {
out = new ObjectOutputStream(fos);
out.writeObject(s);
System.out.println("序列化Students操作完成!");
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
//关闭流
try {
if(out!=null){
out.close();
}
if(fos!=null){
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}