简单测试序列化前后对象大小


public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		 //--ObjectInputStream/ObjectOutputStream--对象输入/输出流  
        int a = 3;
        //程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
		oos.writeObject(a);
		System.out.println("序列化后a的字节数:" + bos.toByteArray().length);
		oos.flush();
		ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bis); 
		
		int c = (Integer) ois.readObject();
		
	}

输出结果:

序列化后a的字节数:81

众所周知,一个int型长度是4个字节,由输出结果知,序列化之后长度变成81,可知序列化的成本是很高的。


下面写个深拷贝中应用序列化的例子:

public class TestSerializeSize {
	
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		 //--ObjectInputStream/ObjectOutputStream--对象输入/输出流  
        TV tv = new TV();  
        tv.setName("changhong");  
        tv.setPrice(1200);  
        tv.setAddress(new Address());
        
        //int a = 3;
        System.out.println(tv);
        System.out.println(tv.getAddress());
        ByteArrayOutputStream bos = new ByteArrayOutputStream();//程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据
        ObjectOutputStream oos = new ObjectOutputStream(bos);
		oos.writeObject(tv);
		System.out.println("序列化后字节数:" + bos.toByteArray().length);
		oos.flush();
		ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bis); 
		TV tv2 = (TV) ois.readObject();
		System.out.println(tv2);
		System.out.println(tv2.getAddress());
		//int c = (Integer) ois.readObject();
		
	}

}

class TV implements Serializable{  
    
    private String name ;  
    private int price;  
    private Address address;
      
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getPrice() {  
        return price;  
    }  
    public void setPrice(int price) {  
        this.price = price;  
    }
	public Address getAddress() {
		return address;
	}
	public void setAddress(Address address) {
		this.address = address;
	}  
    
      
} 

class Address implements Serializable{  
	
}

输出结果:

com.prac.util.serializable.TV@3fbefab0
com.prac.util.serializable.Address@133c5982
序列化后字节数:202
com.prac.util.serializable.TV@2efd552
com.prac.util.serializable.Address@4f9dfbff

可以观察序列化之后TV和Address内存地址都是不相同的,深拷贝就是采用序列化的策略。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值