`

子类继承之序列化解决方案

    博客分类:
  • java
阅读更多
在写原型模式的时候,在用clone()方法实现了的时候,发现对于深拷贝来说,会对每一个相关类添加clone方法.这样会增加代码量,故推荐在深拷贝的时候使用序列化与反序列化实行.参见于我写的原型模式.
在写序列化的时候,我想到关于子类继承实现序列化的问题,倘若是父类实现了Serializable接口,那直接对子类序列化即可.倘若父类没有实现,而子类实现了Serializable,那仅能得到子类属性而得不到其集成自父类的属性了.当然倘若都不实现Serializable,那在序列化的时候是会报错的.对象序列化的时候必须实现Serializable.
下面是父类实现了Serializable的代码:
package serializable;

import java.io.Serializable;

public class SuperClass implements Serializable {

	 String name;
	 String age;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	

}

package serializable;


public class SonClass extends SuperClass {
	String sex;
	String profession;

	public String getSex() {
		return sex;

	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getProfession() {
		return profession;
	}

	public void setProfession(String profession) {
		this.profession = profession;
	}

}

package serializable;

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

public class Test {
	public static void main(String[] args) {
		SonClass son = new SonClass();
		son.setName("Alex");
		son.setAge("20");
		son.setProfession("fighter");
		son.setSex("man");
		SonClass son2=null;
		try {
			FileOutputStream ba = new FileOutputStream("text.txt");
			ObjectOutputStream oo = new ObjectOutputStream(ba);
			oo.writeObject(son);
			oo.flush();
			oo.close();

			FileInputStream bi = new FileInputStream("text.txt");
			ObjectInputStream oi = new ObjectInputStream(bi);
			son2 = (SonClass) oi.readObject();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println(son2.getName());
		System.out.println(son2.getAge());
		System.out.println(son2.getProfession());
		System.out.println(son2.getSex());

	}
}



当父类没有实现serializable,而子类实现的情况下,解决的办法是若父类有带参构造方法的时候,需要添加一个无参构造方法,子类中需要加上:
	private void writeObject(ObjectOutputStream out) throws IOException {
		out.defaultWriteObject();
		out.writeObject(name);
		out.writeObject(age);

	}

	private void readObject(ObjectInputStream in) throws IOException,
			ClassNotFoundException {
		in.defaultReadObject();
		name = (String) in.readObject();
		age = (String) in.readObject();
	}



此方法在序列化时候自动调用,先序列化子类,然后序列化父类的属性.
分享到:
评论

相关推荐

    unity字典序列化工具SerializableDictionary

    总之,`SerializableDictionary`是Unity开发者处理序列化字典问题的一种解决方案,它提供了在Unity环境中存储和恢复字典数据的能力。尽管它可能不是最高效的,但其灵活性和易用性使其成为许多项目中的实用工具。在...

    Java序列化(Serializable)与反序列化_.docx

    2. **子类继承**:如果一个类实现了`Serializable`接口,那么它的所有子类也会自动支持序列化。 3. **引用其他对象**:如果一个对象引用了其他对象,那么这些被引用的对象也需要支持序列化。 #### 总结 序列化是...

    解决xmlns设置后继承到子类问题

    在Java编程中,XML(Extensible Markup Language)常用于配置文件、数据交换和对象序列化。当我们在XML文件中设置了命名空间(xmlns),这个命名空间可能会意外地被继承到其子元素,导致不必要的冲突或者非预期的...

    OR Mapping中对象关系映射解决方案汇总

    ### OR Mapping中对象关系映射解决方案汇总 #### 继承关系映射方案 在面向对象编程中,继承是一种常见的机制,允许子类继承父类的属性和方法。在ORM(对象关系映射)环境中,正确处理继承关系对于构建高效、灵活的...

    深入C#编程——神奇演示

    在深入C#编程的世界里,接口、继承、序列化和反序列化是四个至关重要的概念,它们构成了面向对象编程的核心。下面将详细阐述这些知识点及其在实际开发中的应用。 首先,接口(Interface)是C#中的一种契约,它定义...

    Windows应用程序开发入门到精通十四:复杂的问题一流的解决方案20050414.ppt完整.pptx

    【Windows应用程序开发入门到精通】课程讲解了在.NET框架下进行Windows应用程序开发的关键技术,包括复杂问题的解决方案、代码插入、对象传输以及设计模式的应用。本课程由微软特邀开发专家付仲恺主讲,适合已经熟悉...

    Python 多继承类的 MRO 算法——C3算法

    在Python 2.3之前,这个问题是通过简单深度优先搜索(DFS)策略解决的,但这种方法并不总是给出理想的解决方案。因此,Python引入了C3线性化算法,以确保多继承类的MRO是确定且合理的。 C3算法是一种用于生成多继承...

    unity3d中的坑和解决方案.pdf

    创建单独的GameWorld数据模型模块并实现序列化和反序列化来共享数据。 17. 分时状态逻辑问题: 分时状态逻辑可以通过使用coroutine和配置表来管理。 18. 对象属性灵活管理问题: 使用Dictionary, string> ...

    Newtonsoft.Json.Net20(源码)

    8. **子类继承序列化**:通过 `[JsonInheritanceAttribute]` 特性,可以在反序列化时识别JSON中的类型信息,正确地实例化子类。 9. **流式处理**:对于大量数据,可以使用JsonTextReader和JsonTextWriter进行流式...

    前端开源库-rdf-serializer-abstract

    总结来说,“rdf-serializer-abstract”是一个非常实用的前端开源库,它为RDF序列化提供了一种规范化的解决方案,有助于提升前端开发中处理RDF数据的效率和灵活性。对于那些需要处理语义网数据或者进行数据交换的...

    GSON库源码文档

    当处理继承关系时,GSON允许在反序列化时保留原始类型信息,避免父类和子类的混淆。 10. **错误处理** 在转换过程中遇到异常时,GSON会抛出`JsonSyntaxException`、`JsonParseException`等,便于开发者捕获并处理...

    Java反序列化漏洞自动挖掘方法.pdf

    反序列化是将从磁盘或网络中读取的序列化数据转换回内存中的对象的过程。在Java中,这一过程涉及到`java.io.Serializable`接口以及常见的库如fastjson、jackson和gson。 反序列化漏洞通常发生在以下两个关键命题中...

    【类库与框架】-RMModelObject.7z

    RMModelObject 提供了一种自动化的解决方案,减少了手动编码的繁琐工作。通过定义属性并利用RMModelObject 的特性,开发者可以轻松地创建可序列化和反序列化的对象,这对于构建RESTful API客户端特别有用。 ...

    fastJSON_v2.3.5_JSON_windows_V2_

    这意味着当序列化或反序列化对象时,FastJSON可以处理继承层次结构,能够正确地保存和恢复对象的类型信息,使得子类的对象也能被正确地序列化和反序列化,这对于处理复杂对象模型的项目非常有用。 标签中的"JSON"是...

    spring整合quartz常见问题

    - **方案二**: 继承`MethodInvokingJobDetailFactoryBean`,并在子类中实现特定的序列化逻辑,使其能够在BLOB字段中正确存储。 **扩展解释**: - **方案一**是更为推荐的方法,因为它能够确保所有JobDataMap中的值都...

    java经典实例 代码简短详细

    - **示例**: 虽然提供的代码片段中未包含序列化的具体实现,但可以参考 `Food` 类及其子类的设计来理解如何实现序列化。 通过以上分析,我们可以看到面向对象思想在实际开发中的应用,包括接口、抽象类、多态性等...

    JBoss POJO Cache

    **JBoss POJO Cache** 是一个基于 **JBoss AOP Framework** 实现的缓存解决方案,主要用于优化数据存储和检索的效率。它扩展了 **Core Cache** 功能,并且特别针对POJO(Plain Old Java Object)对象进行了优化,...

    华中科技大学计算机学院-课程实验-JAVA实验-内含源码和说明书.zip

    1. **Java程序设计实验报告一(新) .doc**:这是一个实验报告模板,学生需要根据这个模板来记录他们在实验一中的过程、遇到的问题、解决方案以及实验结果。这涉及到如何撰写技术报告,包括问题分析、步骤记录、代码...

    Chap 1 - Introduction -6

    过程化编程主要关注于数据结构、算法以及程序步骤的序列化;而面向对象编程则更加侧重于将现实世界中的实体抽象为对象,并通过这些对象的行为来解决问题。 #### 面向对象的基本概念 面向对象编程的基本概念包括类...

    Labview面向对象编程

    9. **对象的序列化与反序列化**:对象序列化是将对象的状态转换为可存储或传输的形式,而反序列化则是恢复这个状态。在Labview中,这通常涉及将对象保存到文件或网络,以便于数据持久化或在不同应用程序之间交换数据...

Global site tag (gtag.js) - Google Analytics