用Java可外部化

在理解Externalizable接口之前,您需要了解序列化。您可以在java中的序列化上阅读有关序列化的更多信息。

Java提供一种称为序列化的机制,以按字节顺序或字节顺序持久化Java对象,其中包括对象的数据以及有关对象的类型和存储在对象中的数据类型的信息。

可外部化:

顾名思义,这是对序列化进行外部化。如果要自定义序列化机制,则可以使用它。它使用自定义的书面机制来执行对象的编组和解组.Externalizable接口扩展了Serializable接口。 如果实现此接口,则需要重写以下方法。

@Overridepublic void readExternal(ObjectInput arg0) throws IOException,ClassNotFoundException {}@Overridepublic void writeExternal(ObjectOutput arg0) throws IOException {}

现在让我们看看序列化是如何发生的:

在发送方:

JVM检查类是否实现了可外部化。如果是,则使用writeExternal()方法对对象进行序列化。如果不实现可外部化但实现serializable,则使用ObjectOutputStream对对象进行序列化。

在接收方:

重建对象并使其可外部化时,不使用args构造函数创建实例,并调用readExternal。如果该对象不可外部化但可序列化,则使用ObjectInputStream重建对象。

让我们从与Java序列化中使用的示例相同的示例开始。

在src-> org.arpit.javapostsforlearning中创建Employee.java

Employee.java:

package org.arpit.javapostsforlearning;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;public class Employee implements Externalizable{ int employeeId;String employeeName;String department;String nationality;public Employee(){}public int getEmployeeId() {return employeeId;}public void setEmployeeId(int employeeId) {this.employeeId = employeeId;}public String getEmployeeName() {return employeeName;}public void setEmployeeName(String employeeName) {this.employeeName = employeeName;}public String getDepartment() {return department;}public void setDepartment(String department) {this.department = department;}public String getNationality() {return nationality;}public void setNationality(String nationality) {this.nationality = nationality;}@Overridepublic void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {employeeId=in.readInt();employeeName=(String) in.readObject();}@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeInt(employeeId);out.writeObject(employeeName);}
}

如果要实现可外部化,则必须没有args构造函数。

在org.arpit.javapostsforlearning中创建ExternalizableMain.java

ExternalizableMain.java:

package org.arpit.javapostsforlearning;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class ExternalizableMain {/*** @author Arpit Mandliya*/public static void main(String[] args) {Employee emp = new Employee();emp.setEmployeeId(101);emp.setEmployeeName("Arpit");emp.setDepartment("CS");//Serializetry{FileOutputStream fileOut = new FileOutputStream("employee.ser");ObjectOutputStream outStream = new ObjectOutputStream(fileOut);outStream.writeObject(emp);outStream.close();fileOut.close();}catch(IOException i){i.printStackTrace();}//Deserializeemp = null;try{FileInputStream fileIn =new FileInputStream("employee.ser");ObjectInputStream in = new ObjectInputStream(fileIn);emp = (Employee) in.readObject();in.close();fileIn.close();}catch(IOException i){i.printStackTrace();return;}catch(ClassNotFoundException c){System.out.println("Employee class not found");c.printStackTrace();return;}System.out.println("Deserialized Employee...");System.out.println("Emp id: " + emp.getEmployeeId());System.out.println("Name: " + emp.getEmployeeName());}
}

运行它:当运行ExternalizableMain.java时,您将获得以下输出

Deserialized Employee...
Emp id: 101
Name: Arpit

如果您已经具有可序列化的功能,那么为什么根本不需要外部化!:

  • 当您使用serializable可序列化任何对象时,除字段外,所有属于对象映射且可以使用实例变量访问的对象也将被序列化。例如:
    • 如果您拥有Employee类,并且其超类是person,则它将序列化所有超类对象(例如person),直到达到“ Object”类为止。
    • 同样,如果Employee具有地址类的实例变量,则它将也序列化整个地址对象图。

当您要序列化的是employeeId和employeeName时,您真的要这么多开销吗?

  • 当您使用可序列化的速度很慢时,JVM使用反射。
  • 进行序列化时,有关类描述的信息(包括其超类的描述以及与该类关联的实例变量)也会存储在流中。同样,这也是性能问题

继承中的继承:

现在我们将了解继承如何影响外部化,因此可能会有很多情况说明超类是否可以外部化,如果不是,那么您将如何处理它以及它是如何工作的,让我们举个例子来看。

我们将创建Person.java,它将是Employee的超类。

PersonEmployeeSerialization

情况1:如果超类未实现Externalizable:

如果超类没有实现externalizable,则需要在实现Externalizable的子类中序列化superclass的字段。

人.java

package org.arpit.javapostsforlearning;
public class Person {String name="default";String nationality;public Person(){System.out.println("Person:Constructor");}public Person(String name, String nationality) {super();this.name = name;this.nationality = nationality;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getNationality() {return nationality;}public void setNationality(String nationality) {this.nationality = nationality;}}

在org.arpit.javapostsforlearning中创建Employee.java

Employee.java:

package org.arpit.javapostsforlearning;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
;public class Employee extends Person implements Externalizable{ int employeeId;String department;public Employee(){}public Employee(int employeeId,String name,String department,String nationality){super(name,nationality);this.employeeId=employeeId;this.department=department;System.out.println("Employee:Constructor");}public int getEmployeeId() {return employeeId;}public void setEmployeeId(int employeeId) {this.employeeId = employeeId;}public String getDepartment() {return department;}public void setDepartment(String department) {this.department = department;}@Override
public void writeExternal(ObjectOutput out) throws IOException {/*since superclass does not implement externalizable, you need to serialize super class field in this class itself*///superclass fieldsout.writeObject(name);out.writeObject(nationality);// its own fieldsout.writeInt(employeeId);out.writeObject(department);
}@Override
public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {/*since superclass does not implement externalizable, you need to deserialize super class field in this class itself*///superclass fieldsname=(String) in.readObject();nationality=(String) in.readObject();// its own fieldsemployeeId=in.readInt();department=(String) in.readObject();}
}

在org.arpit.javapostsforlearning中创建ExternalizableMain.java

ExternalizableMain.java:

package org.arpit.javapostsforlearning;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class ExternalizableMain {/*** @author Arpit Mandliya*/public static void main(String[] args) {//SerializeEmployee emp = new Employee(101,"Arpit","CS","Indian");System.out.println("Before serializing");System.out.println("Emp id: " + emp.getEmployeeId());System.out.println("Name: " + emp.getName());System.out.println("Department: " + emp.getDepartment());System.out.println("Nationality: " + emp.getNationality());System.out.println("************");System.out.println("Serializing");try{FileOutputStream fileOut = new FileOutputStream("employee.ser");ObjectOutputStream outStream = new ObjectOutputStream(fileOut);outStream.writeObject(emp);outStream.close();fileOut.close();}catch(IOException i){i.printStackTrace();}//DeserializeSystem.out.println("************");System.out.println("Deserializing");emp = null;try{FileInputStream fileIn =new FileInputStream("employee.ser");ObjectInputStream in = new ObjectInputStream(fileIn);emp = (Employee) in.readObject();in.close();fileIn.close();}catch(IOException i){i.printStackTrace();return;}catch(ClassNotFoundException c){System.out.println("Employee class not found");c.printStackTrace();return;}System.out.println("After serializing");System.out.println("Emp id: " + emp.getEmployeeId());System.out.println("Name: " + emp.getName());System.out.println("Department: " + emp.getDepartment());System.out.println("Nationality: " + emp.getNationality());}
}

运行 :

当运行ExternalizableMain.java时,您将获得以下输出:

Employee:Constructor
Before serializing
Emp id: 101
Name: Arpit
Department: CS
Nationality: Indian
************
Serializing
************
Deserializing
Person:Constructor
After serializing
Emp id: 101
Name: Arpit
Department: CS
Nationality: Indian

情况2:如果超类实现了Externalizable:

如果超类实现了externalizable,则它还将具有readExternal()和writeExternal()方法,因此它将在这些方法中序列化其自己的字段。

人.java

package org.arpit.javapostsforlearning;import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;public class Person implements Externalizable{String name="default";String nationality;public Person(){System.out.println("Person:Constructor");}public Person(String name, String nationality) {super();this.name = name;this.nationality = nationality;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getNationality() {return nationality;}public void setNationality(String nationality) {this.nationality = nationality;}@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeObject(name);out.writeObject(nationality);}@Overridepublic void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {name=(String) in.readObject();nationality=(String) in.readObject();}}

在org.arpit.javapostsforlearning中创建Employee.java

Employee.java:

package org.arpit.javapostsforlearning;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
;public class Employee extends Person implements Externalizable{ int employeeId;String department;public Employee(){}public Employee(int employeeId,String name,String department,String nationality){super(name,nationality);this.employeeId=employeeId;this.department=department;System.out.println("Employee:Constructor");}public int getEmployeeId() {return employeeId;}public void setEmployeeId(int employeeId) {this.employeeId = employeeId;}public String getDepartment() {return department;}public void setDepartment(String department) {this.department = department;}@Overridepublic void writeExternal(ObjectOutput out) throws IOException {super.writeExternal(out);out.writeInt(employeeId);out.writeObject(department);}@Overridepublic void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {super.readExternal(in);employeeId=in.readInt();department=(String) in.readObject();}
}

在org.arpit.javapostsforlearning中创建ExternalizableMain.java

ExternalizableMain.java:

package org.arpit.javapostsforlearning;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class ExternalizableMain {/*** @author Arpit Mandliya*/public static void main(String[] args) {//SerializeEmployee emp = new Employee(101,"Arpit","CS","Indian");System.out.println("Before serializing");System.out.println("Emp id: " + emp.getEmployeeId());System.out.println("Name: " + emp.getName());System.out.println("Department: " + emp.getDepartment());System.out.println("Nationality: " + emp.getNationality());System.out.println("************");System.out.println("Serializing");try{FileOutputStream fileOut = new FileOutputStream("employee.ser");ObjectOutputStream outStream = new ObjectOutputStream(fileOut);outStream.writeObject(emp);outStream.close();fileOut.close();}catch(IOException i){i.printStackTrace();}//DeserializeSystem.out.println("************");System.out.println("Deserializing");emp = null;try{FileInputStream fileIn =new FileInputStream("employee.ser");ObjectInputStream in = new ObjectInputStream(fileIn);emp = (Employee) in.readObject();in.close();fileIn.close();}catch(IOException i){i.printStackTrace();return;}catch(ClassNotFoundException c){System.out.println("Employee class not found");c.printStackTrace();return;}System.out.println("After serializing");System.out.println("Emp id: " + emp.getEmployeeId());System.out.println("Name: " + emp.getName());System.out.println("Department: " + emp.getDepartment());System.out.println("Nationality: " + emp.getNationality());}
}

运行 :

当运行ExternalizableMain.java时,您将获得以下输出:

Employee:Constructor
Before serializing
Emp id: 101
Name: Arpit
Department: CS
Nationality: Indian
************
Serializing
************
Deserializing
Person:Constructor
After serializing
Emp id: 101
Name: Arpit
Department: CS
Nationality: Indian

在此示例中,由于Person类在其自己的writeExternal和readExternal方法中存储和还原其字段,因此您无需在子类中保存/恢复超类字段,但是如果您仔细观察Employee类的writeExternal和readExternal方法,您将发现您仍然需要首先调用super.xxxx()方法,该方法确认该可外部化对象还必须与其父类型协调才能保存和恢复其状态的语句。

可外部化的缺点:

  • 如果您对类定义进行了任何更改,则需要相应地维护writeExternal()和readExternal。
  • 如示例所示,子类对象必须与其父类协调才能保存和存储其状态(通过从子类中调用super.xxxx()方法)

参考:来自Java的JCG合作伙伴 Arpit Mandliya在Java中可 外部化, 适用于初学者博客的Java框架和设计模式 。

翻译自: https://www.javacodegeeks.com/2014/03/externalizable-in-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批量删除html网页,批量删除.html · panghuamama/Clearly Local - Gitee.com

批量删除$axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; };$axure.utils.getOtherPath function() { return resources/Other.html; };$axure.utils.getReloadPath function() { return resources/reload.html; };…

推荐30个新鲜出炉的精美 jQuery 效果

jQuery 是最流行和使用最广泛的 JavaScript 框架,它简化了HTML文档遍历,事件处理,动画以及Ajax交互,帮助Web开发人员更快速的实现各种精美的界面效果。jQuery 的易扩展性吸引了来自全球的开发者来共同编写 jQuery 插件&#xff0c…

会计专业计算机技能大赛,会计技能大赛策划

会计技能大赛策划一.活动背景会计是一个基于理论和实践相结合的学科,对于经管学院,会计专业是一个新创建的专业,缺少相应的会计实践。作为会计专业的学生,在不断学习理论的同时,我们更应该加强实践操作能力…

vue自定义指令clickoutside扩展--多个元素的并集作为inside

都是个人理解,如果发现错误,恳请大家批评指正,谢谢。还有我说的会比较啰嗦,因为是以自身菜鸡水平的视角来记录学习理解的过程,见谅。 1.前言 产品使用vueelement作为前端框架。在功能开发过程中,难免遇到使…

35个让人惊讶的 CSS3 动画效果演示

本文收集了35个惊人的 CSS3 动画演示,它们将证明 CSS3 Transform 和 Transition 属性的强大能力。CSS 是网页设计非常重要的一部分,随着越来越多的浏览器对 CSS3 支持的不断完善,设计师和开发者们有了更多的选择。如今,用纯 CSS 就…

计算机社团活动丰富多彩,描写社团丰富多彩的句子

我们学校的社团活动真是丰富多彩用这个句子开头试着写一段话感恩生命,感谢她给予我们丰富的感情。喜怒哀乐,悲思忧惧,洒洒脱脱,原原本本,痛快淋漓,无拘无束;喜而笑,怒而吼&#xff0…

宝元系统u盘使用说明_教你如何使用U盘安装电脑系统

①到老毛桃官网首页下载老毛桃UEFI版u盘启动盘制作工具安装到电脑上;②准备一个容量在4G以上并能够正常使用的u盘。1第一步将u盘插入电脑usb接口,程序会自动扫描,我们只需在下拉列表中选择用于制作的u盘,然后点击“一键制作”按钮…

支持在iPad中播放的HTML5视频网站推荐

YouTube是最早支持HTML5视频的网站,随着iPad等平板电脑的流行,越来越多的视频网站开始支持HTML5视频播放。下面就向大家分享一些国内的HTML5视频网站,是根据网上信息整理而成,欢迎大家反馈和推荐更多的HTML5视频网站。 腾讯 优酷…

为什么用链路聚合_H3C ComwareV7平台网络设备可靠性配置——链路聚合

H3C ComwareV7平台网络设备可靠性配置——链路聚合链路聚合简介:链路聚合是通过多个物理接口(通常指以太网接口,串口只在特定场景且与以太网聚合技术等同故不再赘述)捆绑实现的逻辑接口,而这些被捆绑在一起的以太网接口就称为该聚合组的成员端…

获取 HTML5 网页设计灵感的10个网站推荐

这篇文章向大家推荐10个收集 HTML5 网页作品的网站,让大家感受一下 HTML5 的魅力。作为下一代网页标准,HTML5 增加了很多新标签以及新特性,正引领网页技术革命。希望这些优秀的 HTML5 网页案例能带给大家制作 HTML5 网页的灵感。 HTML5 Gall…

postgresql存图片字段类型_PostgreSQL让人着迷的多态性,另辟蹊径省时又省力

PostgreSQL 让人着迷的地方,不在于他比某些数据库的流行,也不在于比某些数据库的高“贵”, 更不如某些数据库的“简单”。Postgresql 让人无法自拔的是他的”多端变化”, 用开发的角度来说,叫多态性。PG本身支持着太多…

计算机怎么查看U盘品牌,如何查看电脑u盘使用

如何查看电脑u盘使用其实笔记本设置U盘启动也并不困难,小编这就教你怎样设置U盘启动!全是硬货!第一步:我们先把U盘插入笔记本的USB接口上,(注意:请不要通过USB延长线来连接笔记本)插上U盘后重启笔记本本。电…

Maven补全之生命周期(Lifecycle)

Maven补全之生命周期(Lifecycle) Maven生命周期基础概念 Maven是基于生命周期构建的,一个Maven项目的构建是已经被清晰定义的过程。 对于我们使用Maven构建项目来说,POM.xml文件可以确保我们得到自己想要的项目(项目名&#xff0c…

善用封盖

不久前,在博客文章中 ,我解释了Groovy中的Closure。 这篇博客文章将解释一个使用它们的好例子。 最近,我发现自己不得不为服务AJAX请求的大量后端Controller API编写相同的异常处理逻辑。 就像这样: class ApiRugbyPlayerControl…

12款精美的免费 HTML 网站模板下载

这篇文章收集了12款精美的免费HTML网站模板分享给大家,您可以免费下载使用。相信这些漂亮的HTML网站模板既能够帮助您节省大量的时间和精力,又能有很满意的效果。感谢那些优秀的设计师分享他们的劳动成果,让更多的人可以使用他们的创意设计&a…

两个数相乘积一定比每个因数都大_小升初数学知识点大全含公式+20类必考应用题(含答案解析),孩子考试一定用得上!...

小升初数学知识点大全含公式一、几何图形周长、面积和体积公式*三角形的面积=底高2。S ah2正方形的面积=边长边长 S a长方形的面积=长宽 公式 S ab平行四边形的面积=底高 S ah梯形的面积=(上底下底)高2 S(ab)h2内角和&…

WPF自定义TabControl样式

WPF自定义TabControl样式 原文:WPF自定义TabControl样式WPF自定义TabControl&#xff0c;TabControl美化 XAML代码&#xff1a; <TabControl x:Class"SunCreate.Common.Controls.TabControlEx"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentat…

H.264分层结构与码流结构

H.264分层结构 H.264编码器输出的Bit流中&#xff0c;每个Bit都隶属于某个句法元素。句法元素被组织成有层次的结构&#xff0c;分别描述各个层次的信息。 在H.264 中&#xff0c;句法元素共被组织成 序列、图像、片、宏块、子宏块五个层次。在这样的结构中&#xff0c;每一层…

20个很酷的CSS3导航菜单制作教程

CSS3 是对 CSS 规范的一个很大的改善和增强&#xff0c;它使得 Web 开发人员可以很容易的在网站中加入时尚的效果。以前很多需要编写 JavaScript 才能实现的效果&#xff0c;如今只需要简单的写几句 CSS3 代码就能实现。今天这篇文章就向大家推荐20个很酷的CSS3导航菜单制作教程…

金算盘高手论坛资料中心_3D006期 菜鸟论坛精英PK专栏 速来围观!!

点上方“菜鸟选号论坛”→点右上角“...”→选“星标★”每日上午更新&#xff0c;星标置顶与大神不走散苹果是置顶&#xff0c;安卓是星标 点击"菜鸟选号论坛"关注我们论坛明星版块&#xff0c;集全网各路高手之大乘&#xff0c;打造草根明星 展示舞台。同时主要是为…