序列化和反序列化

1. 一个类若想被序列化,则需要实现java.io.Serializable  接口,该接口中没有定义任何 
   方法,是一个标识性接口(Marker Interface),当一个类实现了该接口,就表示这个 
   类的对象是可以序列化的。 
2. 在序列化时,static 变量是无法序列化的;如果A 包含了对B 的引用,那么在序列化 
   A  的时候也会将B 一并地序列化;如果此时A 可以序列化,B 无法序列化,那么当 
   序列化A  的时候就会发生异常,这时就需要将对B 的引用设为transient ,该关键字 

   表示变量不会被序列化。 


3.  当我们在一个待序列化/反序列化的类中实现了以上两个 private  方法(方法声明要 
   与上面的保持完全的一致),那么就允许我们以更加底层、更加细粒度的方式控制序 
   列化/反序列化的过程。 

package com.fgh.serializable;

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;

/**
 * 如果需要特出处理 需要实现writeObject和readObject 
 * 这两个方法不属于任何一个类和任何一个接口 是非常特殊的方法
 * 让自己控制序列化和反序列化的过程
 * @author fgh
 * 
 */
public class SerializableTest2 {
	public static void main(String[] args) throws Exception {
		Person2 Person21 = new Person2("zhangsan", 21, 56.34);
		Person2 Person22 = new Person2("lisi", 24, 23.42);
		Person2 Person23 = new Person2("wangwu", 65, 67.45);

		/**
		 * 序列化 把信息保存到磁盘上
		 */
		try {
			FileOutputStream fos = new FileOutputStream("Person2.txt");
			ObjectOutputStream ooStream = new ObjectOutputStream(fos);
			ooStream.writeObject(Person21);
			ooStream.writeObject(Person22);
			ooStream.writeObject(Person23);
			System.out.println("write success");
			ooStream.close();
			System.out.println("===================");

			/**
			 * 把文件中内容读取到内存中 反序列化时不会调用对象的任何构造方法,仅仅根据所保存的对象状态信息 在内存中重新构建对象
			 */
			FileInputStream fis = new FileInputStream("Person2.txt");
			ObjectInputStream ois = new ObjectInputStream(fis);
			try {
				Person2 p = null;
				for (int i = 0; i < 3; i++) {
					p = (Person2) ois.readObject();
					System.out.println("第" + Integer.valueOf(i + 1) + "个" + ":"
							+ p.getName() + "," + p.getAge() + ","
							+ p.getHeight() + ";");
				}
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}

			ois.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

class Person2 implements Serializable {

	private static final long serialVersionUID = 2605116530076131408L;

	// 加上transient 关键字 该属性将不会被保存
	private String name;

	private int age;

	private double height;

	public Person2(String name, int age, double height) {
		super();
		this.name = name;
		this.age = age;
		this.height = height;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public double getHeight() {
		return height;
	}

	public void setHeight(double height) {
		this.height = height;
	}

	/**
	 * 如果需要特殊处理 需要实现这两个方法
	 * 
	 * @param out
	 * @throws IOException
	 */
	private void writeObject(ObjectOutputStream out) throws IOException {
		System.out.println("write Object...");
	}

	private void readObject(ObjectInputStream in) throws IOException {
		System.out.println("read Object...");
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值