标语: 追着光,靠近光,成为光,然后散发光!
今天给大家分享【Java 序列化】。
一、Java序列化的概念:
序列化,又称持久化,将字节序列写入磁盘中。
将序列化对象写入文件后,可从文件中读取出来,则称之为反序列化。
二、序列化一个对象:
前置条件:
一个类想要序列化,必须满足两个条件:
1、实现 Serializable 接口。
2、该类的属性必须是可序列化的,不想将所有的属性都进行序列化,用关键字 transient。
public class Family implements java.io.Serializable//实现 Serializable 接口
{
public String nickname;
public String hobby;
public String job;
public transient int no;//属性标明是短暂的,不可序列化
public void hobby()
{
System.out.println(nickname+ "'s hobby is "
+ hobby);
}
}序列化对象
import java.io.*;
public class Demo1
{
public static void main(String [] args)
{
Family f= new Family ();
f.nickname = "Tester Achang";
f.hobby = "yoga";
f.job= "system testing";
f.no = 89757;
try
{
FileOutputStream fileOut =
new FileOutputStream("/Serializedata/family.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);//ObjectOutputStream是序列化流,可以将Java程序中的对象写到文件中。
out.writeObject(f);//ObjectOutputStream写对象的方法(特有方法):void writeObject(Object obj):向文件中写对象。
out.close();
fileOut.close();
System.out.printf("Data is saved in /Serializedata/family.ser");
}catch(IOException i)
{
i.printStackTrace();
}
}
}Notes:
1、ObjectOutputStream(OutputStream out):参数要传递字节输出流。
2、ObjectOutputStream 的使用步骤:
三、反序列化一个对象:
反序列化对象
import java.io.*;
public class Demo2
{
public static void main(String [] args)
{
Family f = null;
try
{
FileInputStream fileIn = new FileInputStream("/Serializedata/family.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);//ObjectInputStream 是反序列化流, 可以将文件中的对象读取到 Java 程序中。
f = (Family) in.readObject();//Object readObject():从文件中读取对象,并将该对象返回。
in.close();
fileIn.close();
}catch(IOException i)
{
i.printStackTrace();
return;
}catch(ClassNotFoundException c)
{
System.out.println("Class Family has not been found");
c.printStackTrace();
return;
}
System.out.println("Deserialized Family...");
System.out.println("Nickname: " + f.nickname);
System.out.println("Hobby: " + f.hobby);
System.out.println("Job: " + f.job);
System.out.println("No: " + f.no);
}
}执行以上实例,输出结果为:
Deserialized Family...
Nickname:Tester Achang
Hobby:yoga
job:system testing
N0:0Notes:
1、当 Family 对象被序列化时,属性 No 的值为 89757,但该属性是短暂的,该值没有被发送到输出流,所以反序列化后 Family 对象的 No属性为 0。
2、ObjectInputStream(InputStream in):参数要传递字节输入流。
3、ObjectInputStream 的步骤: