java为什么只有实现了Serializable接口才可以序列化

序列化都知道,实现了Serializable接口就可以了。可  Serializable接口里面什么也没有,我实现其他的(比如我自己写的)接口是否也可以呢?答案是不可以的,问题出在ObjectOutputStream类里面。一般序列化的代码如:

A a = new A(25,"姓名");  
   System.out.println(a);  
   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c://transient.txt"));  
   oos.writeObject(a);  
   oos.close();  
   ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c://transient.txt"));  
   a = (A)ois.readObject();  
   System.out.println(a);  

而在  ObjectOutputStream  里有如下代码:

// remaining cases
	    if (obj instanceof String) {
		writeString((String) obj, unshared);
	    } else if (cl.isArray()) {
		writeArray(obj, desc, unshared);
	    } else if (obj instanceof Enum) {
		writeEnum((Enum) obj, desc, unshared);
	    } else if (obj instanceof Serializable) {
		writeOrdinaryObject(obj, desc, unshared);
	    } else {
		if (extendedDebugInfo) {
		    throw new NotSerializableException(
			cl.getName() + "\n" + debugInfoStack.toString());
		} else {
		    throw new NotSerializableException(cl.getName());
		}    
	    }
显然如果要序列化的对象是一个String、Enum 对象,或者 cl.isArray()成立(数组),都可以直接序列化的。如果这些都不是,那么只能实现  Serializable 接口了。如果连Serializable 接口也没有实现,那么抛异常
参考:http://blog.csdn.net/aboy123/article/details/37930045#comments


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值