1.什么是序列化
序列化就是将对象的状态信息转换为可以存储或传输的形式,使对象可以持久化的保存。
2.什么是持久化
就是可以长久的保存对象。比如将对象保存在文件中、将对象保存在网络中、远程的传输获取对象,随取随用。
3.java中实现对象的序列化有两种方法
- 实现Serializable接口
- 实现Externalizable接口
4.实现Serializable接口的代码
User类:里面的age属性被transient修饰
public class User implements Serializable {
private String name;
transient private int age;//这个值不序列化
private Man man;
public User(String name,int age,Man man){
this.name=name;
this.age=age;
this.man=man;
}
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;
}
public Man getMan() {
return man;
}
public void setMan(Man man) {
this.man = man;
}
Man类:实现了Serializable接口
public class Man implements Serializable {
private String name;
public Man(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
执行类:
public class Main {
public static void main(String[] args)throws Exception{
Main.write();
Main.read();
}
public static void write()throws Exception{
Man man=new Man("小新");
User user=new User("大新",18,man);
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:/test/111.txt"));
oos.writeObject("测试");
oos.writeObject(user);
oos.close();
}
public static void read()throws Exception{
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:/test/111.txt"));
String str=(String)ois.readObject();
User user=(User)ois.readObject();
ois.close();
System.out.println(str+",userName:"+user.getName()+",userAge:"+user.getAge()+",manName:"+user.getMan().getName());
}
}
返回的结果:测试,userName:大新,userAge:0,manName:小新
其中age因为被transient修饰,所以age结果为0。
上述代码还要注意的是如果Man类没有实现Serializable接口,那么将会报错!也就是说序列化的对象包含的对象也要实现序列化
5.实现Externalizable接口的代码
User类:
public class User implements Externalizable{
private String name;
private Integer age;//这儿取的Integer
public User(){
}
public User(String name,Integer age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
@Override
public void readExternal(ObjectInput in)throws IOException, ClassNotFoundException{
name=(String)in.readObject();
age=in.readInt();
}
@Override
public void writeExternal(ObjectOutput out)throws IOException {
out.writeObject(name);
out.writeInt(age);
}
}
执行类:
public class Main {
public static void main(String[] args)throws Exception{
User user=new User("小新",18);
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:/111.txt"));
oos.writeObject(user);
oos.close();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:/111.txt"));
User result=(User)ois.readObject();
ois.close();
System.out.println("姓名:"+result.getName()+",年龄:"+result.getAge());
}
}
返回的结果:姓名:小新,年龄:18
注意Integer类型的readInt()和writeInt(),String类型是属于Object的。
还有一个特别要注意的是User必须要有默认的构造方法。否则会报错。