1、什么是序列化和反序列化
Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。
2、什么情况下需要序列化 
a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
3、如何实现序列化
将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。
4、序列化和反序列化例子
如果我们想要序列化一个对象,首先要创建某些OutputStream(如FileOutputStream、ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节的,不能使用Reader和Writer等基于字符的层次结构)。而反序列的过程(即将一个序列还原成为一个对象),需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在ObjectInputStream内,然后调用readObject()即可。

package com.gfzs.domain;

import java.io.Serializable;
import java.util.Date;

public class LoginLog implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private int loginLogId;

	private int userId;

	private String ip;

	private Date loginDate;

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public Date getLoginDate() {
		return loginDate;
	}

	public void setLoginDate(Date loginDate) {
		this.loginDate = loginDate;
	}

	public int getLoginLogId() {
		return loginLogId;
	}

	public void setLoginLogId(int loginLogId) {
		this.loginLogId = loginLogId;
	}

	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

}



package com.gfzs.domain;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectSer {

	public static void main(String args[]) throws IOException,
			ClassNotFoundException {

		Student stu = new Student(981036, "LiuMing", 18, "CSD");

		FileOutputStream fo = new FileOutputStream("data.ser");

		ObjectOutputStream so = new ObjectOutputStream(fo);

		try {

			so.writeObject(stu);

			so.close();

		} catch (IOException e) {
			System.out.println(e);
		}

		stu = null;

		FileInputStream fi = new FileInputStream("data.ser");

		ObjectInputStream si = new ObjectInputStream(fi);

		try {

			stu = (Student) si.readObject();

			si.close();

		} catch (IOException e)

		{
			System.out.println(e);
		}

		System.out.println("Student Info:");

		System.out.println("ID:" + stu.id);

		System.out.println("Name:" + stu.name);

		System.out.println("Age:" + stu.age);

		System.out.println("Dep:" + stu.department);

	}

}



5、序列化ID


序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功。这也可能是造成序列化和反序列化失败的原因,因为不同的序列化id之间不能进行序列化和反序列化。


6.序列化前和序列化后的对象的关系
是 "=="还是equal? or 是浅复制还是深复制? 
答案:深复制,反序列化还原后的对象地址与原来的的地址不同
序列化前后对象的地址不同了,但是内容是一样的,而且对象中包含的引用也相同。换句话说,通过序列化操作,我们可以实现对任何可Serializable对象的”深度复制(deep copy)"——这意味着我们复制的是整个对象网,而不仅仅是基本对象及其引用。对于同一流的对象,他们的地址是相同,说明他们是同一个对象,但是与其他流的对象地址却不相同。也就说,只要将对象序列化到单一流中,就可以恢复出与我们写出时一样的对象网,而且只要在同一流中,对象都是同一个。