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;
}
}
Java 序列化的测试代码
最新推荐文章于 2022-12-01 19:11:07 发布