Java 序列化的测试代码

package model;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
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;
import java.util.ArrayList;
import java.util.List;

import com.caucho.hessian.io.HessianInput;
import com.caucho.hessian.io.HessianOutput;

public class SerializableTest {

	public static void main(String[] args) {
		try {
			//TEST1();
			TEST2();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 证明:
	 * 可以批量传送不同对象,注意:同一个对象(同一个内存区)只会序列化一遍!无法改变值!
	 */
	public static void TEST1() throws FileNotFoundException, IOException, ClassNotFoundException{
		//也可扔一个ByteArrayOutputStream进去使用ByteArrayInputStream取出
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));
		List<Object> list_obj = new ArrayList<Object>();
		list_obj.add(new Book("纸质书NO1",2));
		list_obj.add(new Book("纸质书NO2",6));
		list_obj.add(new IBook("电纸书NO1",1,12));
		list_obj.add(new IBook("电纸书NO2",2,14));
		Book book3 = new Book("纸质书NO3",8);
		list_obj.add(book3);
		book3.setName("电纸书NO3");//实际序列化,这个对象值没改变
		list_obj.add(book3);
		oos.writeObject(list_obj);
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("obj.txt"));
		//写入多个对象,按顺序读取。BUG:第二次写入同一个Book,只写入序列化编号(视作第一个Book的引用,无法写入第二个相同对象)
		for(Object book : (List<Object>)in.readObject()){
			if(book.getClass().getSimpleName().equals("Book"))
				System.out.println(((Book) book).getName()+"的本数:"+((Book) book).getNum());
			if(book.getClass().getSimpleName().equals("IBook"))
				System.out.println(((IBook) book).getName()+"的价格:"+((IBook) book).getPrice()+
						"本数:"+((IBook) book).getNum());
		}
		in.close();
		oos.close();
	}
	/**
	 * 用于比较基于hessian与java自配工具的效率;
	 * hessian 50~60ms.花费了更多时间,传输的数据量更小
	 * java自配:10ms
	 * @throws IOException 
	 * @throws ClassNotFoundException 
	 * */
	public static void TEST2() throws IOException, ClassNotFoundException{
		//数据
		List<Object> list_obj = new ArrayList<Object>();
		list_obj.add(new Book("纸质书NO1",2));
		list_obj.add(new Book("纸质书NO2",6));
		list_obj.add(new IBook("电纸书NO1",1,12));
		list_obj.add(new IBook("电纸书NO2",2,14));
		Book book3 = new Book("纸质书NO3",8);
		list_obj.add(book3);
		book3.setName("电纸书NO3");//实际序列化,这个对象值没改变
		list_obj.add(book3);
		//测试基于java的时间
		//测试基于hessian包的时间
		long t1 = System.currentTimeMillis();
		ByteArrayOutputStream byteout = new ByteArrayOutputStream();
		HessianOutput ho = new HessianOutput(byteout);
		ho.writeObject(list_obj);
		ByteArrayInputStream bytein = new ByteArrayInputStream(byteout.toByteArray());
		HessianInput hi = new HessianInput(bytein);
		List<Object> list = (List<Object>)hi.readObject();
		byteout.close();
		bytein.close();
		ho.close();
		hi.close();
		long t2 = System.currentTimeMillis();
		System.out.println("hessian处理时间:"+(t2-t1));
		for(Object book : list){
			if(book.getClass().getSimpleName().equals("Book"))
				System.out.println(((Book) book).getName()+"的本数:"+((Book) book).getNum());
			if(book.getClass().getSimpleName().equals("IBook"))
				System.out.println(((IBook) book).getName()+"的价格:"+((IBook) book).getPrice()+
						"本数:"+((IBook) book).getNum());
		}
		long t3 = System.currentTimeMillis();
		System.out.println("解析处理时间:"+(t3-t2));
		//???????????????????
		long t4 = System.currentTimeMillis();
		ByteArrayOutputStream byteout2 = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(byteout2);
		oos.writeObject(list_obj);
		ByteArrayInputStream bytein2 = new ByteArrayInputStream(byteout2.toByteArray());
		ObjectInputStream in = new ObjectInputStream(bytein2);
		List<Object> list2 = (List<Object>)in.readObject();
		byteout2.close();
		bytein2.close();
		oos.close();
		in.close();
		long t5 = System.currentTimeMillis();
		System.out.println("java自配处理序列化时间:"+(t5-t4));
		for(Object book : list2){
			if(book.getClass().getSimpleName().equals("Book"))
				System.out.println(((Book) book).getName()+"的本数:"+((Book) book).getNum());
			if(book.getClass().getSimpleName().equals("IBook"))
				System.out.println(((IBook) book).getName()+"的价格:"+((IBook) book).getPrice()+
						"本数:"+((IBook) book).getNum());
		}
		long t6 = System.currentTimeMillis();
		System.out.println("解析处理时间:"+(t6-t5));
	}

}


class Book implements Serializable{
	private static final long serialVersionUID = 1L;
	private String name;
	private Integer num;
	Book(String name,Integer num){
		this.name = name;
		this.num = num ;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getNum() {
		return num;
	}
	public void setNum(Integer num) {
		this.num = num;
	}
}
class IBook implements Serializable{
	private static final long serialVersionUID = 1L;
	private String name;
	private transient Integer num;
	private Integer price;
	IBook(String name,Integer num,Integer price){
		this.num = num;
		this.name = name;
		this.setPrice(price) ;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getPrice() {
		return price;
	}
	public void setPrice(Integer price) {
		this.price = price;
	}
	public Integer getNum() {
		return num;
	}
	public void setNum(Integer num) {
		this.num = num;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值