java 序列化之当序列化遭遇继承,组合,对象引用

public class Serial extends SerializableEr implements Serializable{
    private static final Logger LOG = Logger.getLogger(Serial.class);
    int id;
	String name;
	private static final Test test =new Test();
	public Serial(int id, String name) {
		this.id = id;
		this.name = name;
	}
	public String toString() {
		return "DATA: " + id + " " +name+super.test;

	}
	public static void main(String[] args) throws Exception{
        Serial serial=new Serial(1,"4234");
        System.out.println("object serial:"+serial); 
        try{
            FileOutputStream fos=new FileOutputStream("serialTest.txt"); 
            ObjectOutputStream oos=new ObjectOutputStream(fos); 
            oos.writeObject(serial); 
            oos.flush(); 
            oos.close(); 
        }catch(Exception e){
            System.out.println("Exception:"+e); 
        }
        a();
    }
  public static void a()throws Exception{
      FileInputStream fos=new FileInputStream("serialTest.txt"); 
      ObjectInputStream oos=new ObjectInputStream(fos); 
      Object o=  oos.readObject();
      System.out.println(o);
  }	
	

 

public class Test {
   
}

 

 

public class SerializableEr {
    
    Test test =new Test();
   // public SerializableEr(){};
}

 

运行结果:object serial:DATA: 1 4234ser.Test@9971ad
DATA: 1 4234ser.Test@1bf6770
当把  Serial  改为 private static final Test test =new Test();

public class Serial extends SerializableEr implements Serializable{
    private static final Logger LOG = Logger.getLogger(Serial.class);
    int id;
	String name;
	/*private static final*/ Test test =new Test();
	public Serial(int id, String name) {
		this.id = id;
		this.name = name;
	}
	public String toString() {
		return "DATA: " + id + " " +name+super.test;

	}
	public static void main(String[] args) throws Exception{
        Serial serial=new Serial(1,"4234");
        System.out.println("object serial:"+serial); 
        try{
            FileOutputStream fos=new FileOutputStream("serialTest.txt"); 
            ObjectOutputStream oos=new ObjectOutputStream(fos); 
            oos.writeObject(serial); 
            oos.flush(); 
            oos.close(); 
        }catch(Exception e){
            System.out.println("Exception:"+e); 
        }
        a();
    }
  public static void a()throws Exception{
      FileInputStream fos=new FileInputStream("serialTest.txt"); 
      ObjectInputStream oos=new ObjectInputStream(fos); 
      Object o=  oos.readObject();
      System.out.println(o);
  }	
	
}

   

object serial:DATA: 1 4234ser.Test@9971ad
Exception:java.io.NotSerializableException: ser.Test
Exception in thread "main" java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: ser.Test
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at ser.Serial.a(Serial.java:40)
	at ser.Serial.main(Serial.java:35)
Caused by: java.io.NotSerializableException: ser.Test
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at ser.Serial.main(Serial.java:29)

 总结:

  事实证明。

 1:java的序列化时 。只是序列化jvm堆上的对象以及属性对象,,像静态变量就可以不实现序列化接口,因为静态变量在存在与方法区的,

场景2:

public class Serial extends SerializableEr {
    private static final Logger LOG = Logger.getLogger(Serial.class);
    int id;
	String name;
	private static final Test test =new Test();
	public Serial(int id, String name) {
		this.id = id;
		this.name = name;
	}
	public String toString() {
		return "DATA: " + id + " " +name+super.test;

	}
	public static void main(String[] args) throws Exception{
        Serial serial=new Serial(1,"4234");
        System.out.println("object serial:"+serial); 
        try{
            FileOutputStream fos=new FileOutputStream("serialTest.txt"); 
            ObjectOutputStream oos=new ObjectOutputStream(fos); 
            oos.writeObject(serial); 
            oos.flush(); 
            oos.close(); 
        }catch(Exception e){
            System.out.println("Exception:"+e); 
        }
        a();
    }
  public static void a()throws Exception{
      FileInputStream fos=new FileInputStream("serialTest.txt"); 
      ObjectInputStream oos=new ObjectInputStream(fos); 
      Object o=  oos.readObject();
      System.out.println(o);
  }	
	
}

 

public class SerializableEr implements Serializable{
    
    Test test =new Test();
   // public SerializableEr(){};
}

  结果:

object serial:DATA: 1 4234ser.Test@9971ad
Exception:java.io.NotSerializableException: ser.Test
Exception in thread "main" java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: ser.Test
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at ser.Serial.a(Serial.java:40)
	at ser.Serial.main(Serial.java:35)
Caused by: java.io.NotSerializableException: ser.Test
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at ser.Serial.main(Serial.java:29)

 

 

 

 2:java的序列化时 。当子类实现了序列化接口时,就只序列化子类,及属性,当子类没有实现序列化接口时,就要序列化子类,同时还要序列化实现了序列化接口的父类及属性,

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值