java 序列化 Serializable 与 反序列化 总结

一 、 默认的序列化

一个对象 要能被 序列化,那么他的 类 必须 实现 implements Serializable 接口。


默认 序列化,只 会 序列化 对象 的  成员变量 (transient 修饰符的 除外)。

即  static的变量、所有的方法 都不会 被  序列化。


如果 类 没有  主动地 写 private static final long serialVersionUID = 100000L;  则 默认序列化  会自动生成 一个UID 。


参见代码:

import java.io.Serializable;

public class Student implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 100000L;
	private String name;
	  private transient String password;
	  private static int count=0;
	   
	  public Student(String name,String password)
	  {
	  System.out.println("调用Student的带参的构造方法");
	  this.name=name;
	  this.password=password;
	  count++;
	  }
	  public String toString()
	  {
	  return "人数: "+count+" 姓名: "+name+" 密码: "+password;
	  }

}



package po;

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

public class ObjectSerializableTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try{
			 
			FileOutputStream fos=new FileOutputStream("testabc.obj");
			ObjectOutputStream oos=new ObjectOutputStream(fos);
			 
			Student s1=new Student("张三","12345");
			Student s2=new Student("王五","54321");
			System.out.println(s1);
			System.out.println(s2);
			 
			oos.writeObject(s1);
			oos.writeObject(s2);
			 
			oos.close();
			 
			new Student("xyq","ichedan");
			 
			FileInputStream fis=new FileInputStream("testabc.obj");
			ObjectInputStream ois=new ObjectInputStream(fis);
			 
			  
			Student s3=(Student)ois.readObject();
			Student s4=(Student)ois.readObject();
			  
			  
			System.out.println(s3);
			System.out.println(s4);
			  
			  
			ois.close();
			}
			catch(IOException e)
			{
			e.printStackTrace();
			}
			catch(ClassNotFoundException e1)
			{
			e1.printStackTrace();
			}
			
			

	}

}



最终得到的 序列化 后 的文件 如下截图所示:


可见 只序列化了 name属性。

从中可以得出如下结论: 序列化 实际上 保存了以下内容:
1)对象的类型 

2)

serialVersionUID 的值
3)对象 属性的类型  ( 非 static属性)
4)对象 属性的值    (非 static 属性)





上面程序的 输出结果如下所示:


调用Student的带参的构造方法
调用Student的带参的构造方法
人数: 2 姓名: 张三 密码: 12345
人数: 2 姓名: 王五 密码: 54321
调用Student的带参的构造方法
人数: 3 姓名: 张三 密码: null
人数: 3 姓名: 王五 密码: null






二、也可以 自定义  实现 序列化方法。


这样就可以 精确地 控制 序列化 哪些变量。




参考资料:http://blog.csdn.net/wangzhiqing3/article/details/8392820  java 序列化与 反序列化总结

                    http://blog.csdn.net/wangzhiqing3/article/details/8392814   控制对象的 序列化与 反序列化

                    http://www.iteye.com/topic/14707#





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值