序列化

 

    序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。

    可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。对象序列化可以实现分布式对象,利用序列化可以实现深复制(clone)。

    实现java.io.Serializable 接口以启用其序列化功能,序列化接口没有方法或字段,仅用于标识可序列化的语义。

    为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。private static final long serialVersionUID = 6111235636157041674L;

 

    如果你的对象序列化后存到硬盘上面后,可是后来你却更改了类的field(增加或减少或改名),当你反序列化时,就会出现Exception的,这样就会造成不兼容性的问题。   

    但当serialVersionUID相同时,它就会将不一样的field以type的缺省值赋值(如int型的是0,String型的是null等),这个可以避开不兼容性的问题。所以最好给serialVersionUID赋值  

    eclipse生成serialVersionUID :实现Serializable后,编辑器左边会有一个警告标记(灯泡加叹号),双击它,会有一个菜单弹出,可以选择生成默认的serialVersionUID(1L),还是随机的。

    transient是用于声明序列化的时候不被存储的,这样反序列话是出不来的。如  private transient String password;

       如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。

 

 

 

 

 

package common;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class SerializableObj implements Serializable {
       
       	private static final long serialVersionUID = 6106500970475457768L;

	private String name;

	public SerializableObj() {

		this.name = "张三";

	}

	public String getName() {

		return this.name;

	}

	public void setName(String name) {

		this.name = name;

	}

	/**
	 * ByteArrayOutputStream也可以换替换为FileOutputStream
	 * 
	 * 节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。 处理流:使用节点流作为输入或输出。是使用一个已经存在的输入流或输出流连接创建的。
	 * 一般情况下是:先打开的后关闭,后打开的先关闭
	 * 
	 * 另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b
	 * 
	 * 例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
	 * 
	 * 当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法
	 * 
	 * 如果将节点流关闭以后再关闭处理流,会抛出IO异常
	 * 
	 * 
	 * @author zw
	 * @date 2013-4-11
	 * @param args
	 * @return void
	 */
	public static void main(String[] args) {
		SerializableObj serializableObj = new SerializableObj();

		ByteArrayOutputStream baos = null;
		ObjectOutputStream oos = null;
		ByteArrayInputStream bais = null;
		ObjectInputStream ois = null;
		try {
			baos = new ByteArrayOutputStream();
			oos = new ObjectOutputStream(baos);
			serializableObj.setName("李四");
			oos.writeObject(serializableObj);
			byte[] buf = baos.toByteArray();// 获取内存缓冲中的数据
			bais = new ByteArrayInputStream(buf);
			ois = new ObjectInputStream(bais);
			serializableObj = (SerializableObj) ois.readObject();

			System.out.println(serializableObj.getName());
			baos.close();
			oos.close();
			bais.close();
			ois.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {

			if (oos != null) {
				try {
					oos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (ois != null) {
				try {
					ois.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

	}
}
 

 

 

你可能感兴趣的:(序列化)