Java Serialize

一) 何为序列化(Serialize)
    将Java 对象序列化为 二进制文件的技术称为序列化。

二)何时需要使用到序列化技术
    大致三种情况吧:
    a)当你想把的内存中的对象写入到硬盘的时候;
    b)当你想用套接字在网络上传送对象的时候;
    c)当你想通过RMI传输对象的时候;

三)Hello, Serialize
    话不多说,给个简单例子:
   
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class SerializeClass implements Serializable {
	private static final long serialVersionUID = 1L;
	private String name = "thaIm";
	private transient String ignoreStr = "ignore";
	public static int staticVar = 5;
	
	public static void main(String[] args) {
		try{
	        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("result.obj"));
			out.writeObject(new SerializeClass());
			out.close();
			
			SerializeClass.staticVar = 10;
			
			ObjectInputStream oin = new ObjectInputStream(new FileInputStream("result.obj"));
			SerializeClass sc = (SerializeClass) oin.readObject();
			oin.close();
			
			System.out.println(sc.getName()+"=="+sc.getIgnoreStr()+"=="+SerializeClass.staticVar);
	    } catch (FileNotFoundException e) {
	    	e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public String getName()
	{
	return name;
	}
	public void setName(String name)
	{
	this.name = name;
	}
	public void setIgnoreStr(String ignoreStr) {
		this.ignoreStr = ignoreStr;
	}
	public String getIgnoreStr() {
		return ignoreStr;
	}
}


程序的输出结果: thaIm==null==10
和你想的一样么?

四)serialVersionUID
    如果你第一次接触java序列化,可能会对以上代码中的serialVersionUID字段很好奇。这看似多余的东西到底有何用途呢?且听我娓娓道来~~
   情境:两个客户端 A 和 B 试图通过网络传递对象数据,A 端将对象 C 序列化为二进制数据再传给 B,B 反序列化得到 C。
   实现条件: A B 两个客户端SerializeClass类有相同的: 1)类路径 2)功能代码 3)序列化ID,即serialVersionUID
   而之所以要增加序列化ID一致这个条件,是因为它的存在对于代码的版本控制,代码安全都有不小的好处。

五)多说几句
    1)关键字transient,它可使字段避免被序列化,反序列化时该字段取默认值(比如String的话就为null,int的话为0) 上述例子中 private transient String ignoreStr = "ignore";说明了该情况。
    2)static 字段不会被序列化。原因也很简单,它是类的变量,不是某个实例的变量。注意上述例子中的语句 SerializeClass.staticVar = 10;
    3)序列化存储规则。 对同一对象两次序列化入文件,第二次的序列化将只新增引用信息,以引用第一次序列化的对象。这样做不但可以保证反序列化后两个对象==,而且还能节省不少磁盘空间。是个非常不错的序列化规则哦!

你可能感兴趣的:(java,Serialize)