您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第12章:JAVA IO】_对象序列化
发布时间:2020-12-31 11:45:22编辑:雪饮阅读()
对Serializable接口的实现可以完成对象的序列化
对象的序列化就是对对象属性的序列化,因为对象的方法是一个类的所有对象所共有的。
import java.io.Serializable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.ObjectOutputStream;
class Person implements Serializable{
//定义序列化版本用于反序列化时候和当前类的版本比较,版本相同才可以反序列化(并且不声明这个,在高级IDE中会有警告提示)
private static final long serialVersionUID=1L;
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Hello{
public static void main(String args[]) throws Exception{
File file=new File("d:"+File.separator+"kasumi.txt");
OutputStream out=new FileOutputStream(file);
ObjectOutputStream oos=new ObjectOutputStream(out);
oos.writeObject(new Person("kasumi",24));
oos.close();
}
};
ObjectInputStream的readObject可用于对象的反序列化。
import java.io.Serializable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.InputStream;
import java.io.FileInputStream;
class Person implements Serializable{
private static final long serialVersionUID=1L;
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Hello{
public static void main(String args[]) throws Exception{
File file=new File("d:"+File.separator+"kasumi.txt");
InputStream input=new FileInputStream(file);
ObjectInputStream ois=new ObjectInputStream(input);
Object obj=ois.readObject();
ois.close();
System.out.println(obj);
}
};
D:\>javac Hello.java
D:\>java Hello
姓名:kasumi,年龄:24
实现Externalizable接口可以手动自定义序列化与反序列化的操作
也就是手动定义该接口内部的写操作与读操作。
import java.io.Serializable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.Externalizable;
import java.io.ObjectOutput;
import java.io.IOException;
import java.io.ObjectInput;
class Person implements Externalizable{
private static final long serialVersionUID=1L;
private String name;
private int age;
public Person(){
System.out.println("Externalizable接口反序列化时必须要有一个无参构造");
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
public void writeExternal(ObjectOutput out) throws IOException{
out.writeObject(this.name);
out.writeInt(this.age);
}
public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{
this.name=(String)in.readObject();
this.age=(int)in.readInt();
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Hello{
private static File file=new File("d:"+File.separator+"kasumi.txt");
public static void main(String args[]) throws Exception{
ser();
dser();
}
public static void ser() throws Exception{
OutputStream out=new FileOutputStream(file);
ObjectOutputStream oos=new ObjectOutputStream(out);
oos.writeObject(new Person("kasumi",25));
oos.close();
}
public static void dser() throws Exception{
InputStream input=new FileInputStream(file);
ObjectInputStream ois=new ObjectInputStream(input);
Object obj=ois.readObject();
ois.close();
System.out.println(obj);
}
};
D:\>javac Hello.java
D:\>java Hello
Externalizable接口反序列化时必须要有一个无参构造
姓名:kasumi,年龄:25
Serializable接口序列化中transient关键字可以声明某个成员变量不被序列化
import java.io.Serializable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.Externalizable;
import java.io.ObjectOutput;
import java.io.IOException;
import java.io.ObjectInput;
class Person implements Serializable{
private static final long serialVersionUID=1L;
private transient String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Hello{
private static File file=new File("d:"+File.separator+"kasumi.txt");
public static void main(String args[]) throws Exception{
ser();
dser();
}
public static void ser() throws Exception{
OutputStream out=new FileOutputStream(file);
ObjectOutputStream oos=new ObjectOutputStream(out);
oos.writeObject(new Person("kasumi",25));
oos.close();
}
public static void dser() throws Exception{
InputStream input=new FileInputStream(file);
ObjectInputStream ois=new ObjectInputStream(input);
Object obj=ois.readObject();
ois.close();
System.out.println(obj);
}
};
D:\>javac Hello.java
D:\>java Hello
姓名:null,年龄:25
对象数组序列化与反序列化
ObjectOutputStream的writeObject方法支持对象数组批量操作的重载方法、ObjectInputStream的readObject方法也有对象数组返回类型的重载方法。
所以可以利用此特性实现对象数组的序列化与反序列化。
import java.io.Serializable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.Externalizable;
import java.io.ObjectOutput;
import java.io.IOException;
import java.io.ObjectInput;
class Person implements Serializable{
private static final long serialVersionUID=1L;
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Hello{
private static File file=new File("d:"+File.separator+"kasumi.txt");
public static void main(String args[]) throws Exception{
Person per[]={new Person("kasumi",24),new Person("ayane",25),new Person("snowDrink",18)};
ser(per);
Object o[]=(Object[])dser();
for(Object x:o){
Person p=(Person)x;
System.out.println(p);
}
}
public static void ser(Object obj[]) throws Exception{
OutputStream out=new FileOutputStream(file);
ObjectOutputStream oos=new ObjectOutputStream(out);
oos.writeObject(obj);
oos.close();
}
public static Object[] dser() throws Exception{
InputStream input=new FileInputStream(file);
ObjectInputStream ois=new ObjectInputStream(input);
Object obj[]=(Object[])ois.readObject();
ois.close();
return obj;
}
};
D:\>javac Hello.java
D:\>java Hello
姓名:kasumi,年龄:24
姓名:ayane,年龄:25
姓名:snowDrink,年龄:18
关键字词:java,序列化,对象序列化