黑马程序员_java学习笔记_Java序列化和反序列化
![]() | ![]() | |
![]() | 1、序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保 存object states,但是java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
2、什么情况下需要序列化 a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候; b)当你想用套接字在网络上传送对象的时候; c)当你想通过RMI传输对象的时候;
下面再给个jdk宝典里的例子吧,这样你就应该知道怎么用了:
package book.io;
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Date; /** * 序列化和反序列化对象 */ public class SerializeObject { // 一个内部类,用于被序列化和反序列化。 //一定要实现Serializable才能够被序列化和反序列化。 static class MyClass implements Serializable{ //一般的实例变量会被序列化和反序列化 private int a,b; //transient实例变量 不会 被序列化和反序列化 private transient int c; // 类变量 不会 被序列化和反序列化 private static int d; public MyClass(){ } public MyClass(int a, int b, int c, int d){ this.a = a; this.b = b; this.c = c; MyClass.d = d; } public String toString(){ return this.a + " " + this.b + " " + this.c + " " + MyClass.d; } }
/** * 序列化对象到文件 */ public static void serialize(String fileName) throws Exception{ //创建一个对象输出流,将对象输出到文件 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName)); //序列化一个字符串对象到文件 out.writeObject("Today:"); //序列化当前日期对象到文件 out.writeObject(new Date()); //序列化一个MyClass对象 MyClass my1 = new MyClass(5, 6, 7, 8); out.writeObject(my1); out.close(); } /** * 从文件反序列化到对象 */ public static void deserialize(String fileName) throws Exception{ //创建一个对象输入流,从文件读取对象 ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName)); //注意读对象时必须按照序列化对象时的顺序读,否则会出错 //读取字符串对象 String today = (String)(in.readObject()); System.out.println(today); //读日期对象 Date date = (Date)(in.readObject()); System.out.println(date.toString()); //读MyClass对象,并调用它的add方法。 MyClass my1 = (MyClass)(in.readObject()); System.out.println(my1.toString()); in.close(); //当恢复对象的时候,对象中的所有域被自动的恢复。如果不希望某个域被序列化,可以在它前面 //加上transient关键字,例如下面的代码:transient int noSer = 0; //类似的,如果类中的某个域为静态,它不会被序列化。 } /** * @param args */ public static void main(String[] args) throws Exception{ String fileName = "c:/temp/MyClass.ser"; SerializeObject.serialize(fileName); //注释掉第二行,只运行下面一行,将会发现输出不同 SerializeObject.deserialize(fileName); } } | |
![]() | ![]() |