[代码记录生活]Serializable(序列化)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > [代码记录生活]Serializable(序列化)

[代码记录生活]Serializable(序列化)

 2011/10/14 9:38:49  newerdragon  http://newerdragon.iteye.com  我要评论(0)
  • 摘要:序列化:把对象转换为字节序列(冷冻)把字节序列转换为对象(解冻)序列化应用:把内存中的对象保存到文件或数据库。在网络上传送对象。需要进行序列化的类,必须实现Serializable接口:publicclassPersonimplementsSerializable{........}将一个类写入到文件中(类的序列化):publicstaticvoidmain(String[]args)throwsException{Studentstu=newStudent()
  • 标签:代码 生活 RIA
序列化:
  把对象转换为字节序列(冷冻)
  把字节序列转换为对象(解冻)

序列化应用:
  把内存中的对象保存到文件或数据库。
  在网络上传送对象。

需要进行序列化的类,必须实现 Serializable 接口:
  public class Person implements Serializable{
        ........
  }



将一个类写入到文件中(类的序列化):
  public static void main(String[] args) throws Exception{
        Student stu = new Student();
        File file = new File("bb.txt");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(stu);
}


又将保存在文件中的数据转换成对象(反序列化):
  public static void main(String[] args) throws Exception{
        File file = new File("bb.txt");
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        Object obj = ois.readObject();
        System.out.println(obj.hashCode());
}



反序列化时,是否调用了类的构造方法?
  不会调用构造方法。
  构造方法的作用是初始化类的状态,反序列化时,类的状态是保存在序列化文件中的,
  所以不必再对类的状态进行初始化。

序列化前的对象与序列化后的对象是同一个对象吗?
  不是同一个对象,序列化后的对象仅状态相同(各属性值相同)

如果某时可能不需要序列化一些敏感信息,比如(帐号),比如(密码)
  Transient(瞬态)关键字 : 在指定字段上关闭序列化功能。

  public class Person implements Serializable{
	private String name;
	private int age;
         //序列化Person时,salary将不被序列化    
	private transient double salary;   
           ........
  }


网络通信传输对象(客户端):
  public class Client {
   public static void main(String[] args) throws Exception {
	//准备要发送的对象
	Clothing clothing = new Clothing("西服", "红色");
	User user = new User(1, "yelong1", "男", new Date());
	user.setClothing(clothing);
	
	//建立连接
	Socket socket = new Socket("127.0.0.1", 8888);
	System.out.println("连接成功.........");
         ObjectOutputStream oos = 
         new ObjectOutputStream(socket.getOutputStream());

         //序列化对象到端口号8888上的通信路径
	oos.writeObject(user);
	System.out.println("传输成功.........");
	oos.close();
    }
}


服务端:
  public class Server {
	public static void main(String[] args) throws Exception {
		//等待客户端连接
	ServerSocket ss = new ServerSocket(8888);
	System.out.println("服务器启动,等待客户端连接.....");
	Socket socket = ss.accept();		
		//接收对象
	ObjectInputStream ois = 
        new ObjectInputStream(socket.getInputStream());
	User user = (User) ois.readObject();
		
		//显示接收信息
	System.out.println("接收成功.........");
	System.out.println("id:" + user.getId());
	System.out.println("name:" + user.getName());
	System.out.println("sex:" + user.getSex());
	System.out.println("brithday:" + user.getBirthday());
	System.out.println("memo:" + user.getMemo());
	Clothing serialClothing = user.getClothing();
	System.out.println("clothing:" + serialClothing.getColor() + “ " + serialClothing.getName());
	ois.close();
	}
}



ObjectOutputStream将Java对象的基本数据类型和图形写入 OutputStream。
可以使用 ObjectInputStream 读取(重构)对象。
通过在流中使用文件可以实现对象的持久存储。
如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

只能将支持 java.io.Serializable 接口的对象写入流中。
每个 serializable 对象的类都被编码,编码内容包括类名和类签名、
对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。

writeObject 方法用于将对象写入流中。
所有对象(包括 String 和数组)都可以通过 writeObject 写入。
可将多个对象或基元写入流中。
必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。

还可以使用 DataOutput 中的适当方法将基本数据类型写入流中。
还可以使用 writeUTF 方法写入字符串。

对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。
其他对象的引用(瞬态和静态字段除外)也会导致写入那些对象。
可使用引用共享机制对单个对象的多个引用进行编码,这样即可将对象的图形恢复为最初写入它们时的形状。

发表评论
用户名: 匿名