`
Yinny
  • 浏览: 295732 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

父类可序列化子类可序列化否乎?

 
阅读更多
关于这个问题,写了个简单的代码测试了下:
可序列化的类Father

package com.taobao.test;

import java.io.Serializable;

/**
 * @author tina.wyn
 *
 */
public class Father implements Serializable {
	
	private static final long serialVersionUID = 1L;

	private Integer fatherage;
	
	private String str;
	
	public Father() {
		fatherage = 50;
		str = "I am father";
	}

	public Integer getNumber() {
		return fatherage;
	}

	public void setNumber(Integer number) {
		this.fatherage = number;
	}

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}
}

不可序列化的类Mother
package com.taobao.test;

public class Mother {

	private Integer matherage;

	private String str;
	
	public Mother(){
		matherage = 30;
		str = "I am mother";
	}

	public Integer getMatherage() {
		return matherage;
	}

	public void setMatherage(Integer matherage) {
		this.matherage = matherage;
	}

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}
	

}


子类Son继承了父类Father

package com.taobao.test;

/**
 * @author tina.wyn
 *
 */
public class Son extends Father {
	private static final long serialVersionUID = 1L;

	
	private int age;
	
	private transient String unserialize;
	
	public Son() {
                age = 10;
		unserialize = "hi";
	}
	

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}


	public String getUnserialize() {
		return unserialize;
	}


	public void setUnserialize(String unserialize) {
		this.unserialize = unserialize;
	}

	
}

package com.taobao.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * @author tina.wyn
 *
 */
public class TestSerialize {

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		
		Son s = new Son();
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("hello")));
		objectOutputStream.writeObject(s);
		
		ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("hello")));
		Son sn = (Son) objectInputStream.readObject();
		
		System.out.println(sn.getAge());
		System.out.println(sn.getNumber());
		System.out.println(sn.getStr());
		System.out.println(sn.getUnserialize());
           }
}


运行结果

10
50
I am father
null


由此证明父类可序列化子类也可序列化,而sn.getUnserialize()为null是因为子类里将它定义为了transient 类型的,所以子类的属性可否序列化取决于如何定义。
现在我们在子类里加入Mother类的引用


package com.taobao.test;

/**
 * @author tina.wyn
 *
 */
public class Son extends Father {
	private static final long serialVersionUID = 1L;

	
	private int age;
	
	private transient String unserialize;
        Mother mother;
	
	public Son() {
		mother = new Mother();
		age = 10;
		unserialize = "hi";
	}
	

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}


	public String getUnserialize() {
		return unserialize;
	}


	public void setUnserialize(String unserialize) {
		this.unserialize = unserialize;
	}


	public Mother getMother() {
		return mother;
	}


	public void setMother(Mother mother) {
		this.mother = mother;
	}

	
}

运行结果:
    
  Exception in thread "main" java.io.NotSerializableException: com.taobao.test.Mother
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
	at com.taobao.test.TestSerialize.main(TestSerialize.java:21)

吼吼,出错鸟~Mother类不支持序列化哈~~~
分享到:
评论

相关推荐

    07-Java序列化面试题(10题)-新增.pdf

    1. 什么是 Java 序列化,如何实现 Java 序列化? Java 序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。为了实现 Java 序列化,需要将需要被序列化的类实现 Serializable 接口,然后使用...

    java 首先定义一个父类计算如下表达式:

    - **构造函数**:`A(int b, float c)`接收两个参数,用于初始化子类特有的成员变量`x`以及继承自父类的`n`。 - **成员方法**:`fun1()`通过调用父类的`fun()`方法并乘以`x`来计算新的序列值。 ### 三、定义另一个子...

    java面试题目(好东西)

    - 实现序列化,只需让类实现`Serializable`接口,Java会自动处理序列化和反序列化。 14. **在COLLECTION框架中实现比较要实现的接口** 如果要在集合框架中进行比较,一般需要实现`Comparable<T>`接口或使用`...

    Java面试题经典集合

    6. 什么是Java序列化,如何实现Java序列化? Java序列化是将对象转换为字节流的过程,便于存储或在网络上传输。实现序列化需让类实现`java.io.Serializable`接口。例如: ```java class MyClass implements ...

    c# 类成员初始化顺序的特殊情况

    这种情况下,C#会确保在`Child2`类的静态字段初始化之前,先完成`Base2`类的所有静态初始化。因此,输出会显示出父类的静态字段和构造函数先于子类的相应部分执行。 **情况2:子类静态构造函数中使用父类静态字段**...

    Hadoop源代码分析(类Task)

    - `write` 和 `readFields`:实现Writable接口,用于序列化和反序列化Task对象。 - `localizeConfiguration`:将Task相关信息存入JobConf,便于参数传递。 4. **任务生命周期相关函数** - `done...

    东软Java笔试题答案.doc

    东软 Java 笔试题答案 本资源提供了 Java 笔试题答案,涵盖了面向... 实例化子类对象要看父类 知识点:继承、父类、子类、实例化对象 12. 下面程序运行的结果是 A. Base 知识点:继承、父类构造函数、子类构造函数

    个人整理java笔记

    在子类实例化时,会先实例化父类的部分,然后实例化子类特有的部分。 - 子类可以通过重写方法来提供不同的实现。 - 上转型指的是父类引用指向子类对象。这种情况下,只能访问父类中定义的方法和属性。 - **多态**...

    Java经典问题答案(带书签).pdf

    - 类初始化按照继承层次结构从父类到子类依次进行。 - 静态成员先于实例成员初始化。 **普通代码块、静态代码块、构造代码块的区别** - 普通代码块在构造函数调用时执行。 - 静态代码块只执行一次,在类加载时执行...

    java基础笔试题.pdf

    当实例化子类时,会调用父类的构造方法,体现了继承的传递性。 17. **final关键字**:final可以修饰类、方法和变量。final类不能被继承,final方法不能被重写,但final变量一旦赋值就不能改变。 18. **访问修饰符*...

    《编写高质量代码:改善Java程序的151个建议》笔记

    - 子类实例化过程中,首先初始化父类变量,调用父类构造函数,随后初始化子类变量,最后生成子类实例。 6. **构造函数中避免初始化其他类** - 构造函数中尽量避免创建或初始化其他类的对象,以减少耦合度。 7. ...

    UVM相关基础知识分享

    UVM(Universal Verification Methodology)是一种广泛用于系统级验证的框架,它提供了组件化、可重用和可扩展的方法来构建验证环境。本篇文章将深入探讨UVM的基础知识,特别是关于组件创建和配置管理的方面。 首先...

    python类中super()和__init__()的区别

    总结一下,`__init__()` 是一个初始化方法,而 `super()` 是一个函数,用于在多继承中调用父类(或祖先类)的方法。`super()` 自动处理MRO,确保正确地沿着继承链调用初始化方法,避免了手动管理父类调用的复杂性。...

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics