java中属性外部化_用Java可外部化

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()方法)

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

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

java中属性外部化

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

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

相关文章

在您的Maven-Fu包中增加了一些东西

Apache Maven很简单,但是功能非常强大。 使用一些技巧,您可以大大简化和优化您的开发经验。 处理多个非托管模块 假设您有一个主项目A提供了两个实用程序模块foo和bar ,另一个项目B A了foo和bar 。 在使用B ,您意识到需要偶尔对…

ci 邮件 html模板,CI Email类发邮件

发邮件代码详情private function _send_mail($data) {//附件一,名称参数编码转换if(!empty($data[resume_name])){$file_name iconv(UTF-8,GB2312,$data[file_name]);}//附件二,名称参数编码转换if(!empty($data[resume_name])){$resume_name iconv(UT…

Java安全动画

总览 自从JDK 1.2中引入安全沙箱模型以及JDK提供的安全API的发展以来,Java安全就一直是一个复杂的话题。 并发实用程序也观察到类似的问题,并且开发了一种名为Java Concurrent Animated的工具,目的是通过有趣而有趣的方式降低进入这些实用程序…

在计算机网络系统的远程通信中,在计算机网络系统的远程通信中,通常采用的传输技术是...

摘要:算机体系体系模板模板最适宜采用的合钢是组。系统信中民主命叙主义关于革命以下义革误的和社会主述错是(。程通常采传输不属民主主义济纲的三大经以下于新领的是(。...算机体系体系模板模板最适宜采用的合钢是组。网络不属特殊国无级自的是产阶以下于中有的优点…

ajax div 赋值重新渲染_优化向:单页应用多路由预渲染指南

前言Ajax 技术的出现,让我们的 Web 应用能够在不刷新的状态下显示不同页面的内容,这就是单页应用。在一个单页应用中,往往只有一个 html 文件,然后根据访问的 url 来匹配对应的路由脚本,动态地渲染页面内容。单页应用在…

fpga运算服务器_一张图了解CPU、GPU、ASIC、FPGA性能、功耗效率、灵活性

​CPU:中央处理器(Central Processing Unit,CPU):通用芯片,主要生产厂家如intel、AMD等,用于PC、服务器等领域。CPU作为通用芯片,可以用来做很多事情,灵活性最高&#xf…

aspen变压吸附塔_空压机科普:吸附式干燥机的结构和原理

精彩内容本文以主流的“变压吸附式”干燥机为例进行讲解。“吸附”原理一致,“脱附再生”流程有所区别。从而大致形成以下几种常见类型:●无热吸附式——使用一部分经过干燥后的压缩空气,经降压后吹扫吸附剂,实现吸附剂“再生”&a…

小学计算机管理,小学计算机室管理制度

小学计算机室管理制度 (2页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.90 积分芹菜小学计算机室制度1、计算机室由上电脑课老师负责管理。2、计算机室是进行电脑技术学习和操作的场所&#xff…

异形3×3魔方还原教程_【初级篇】(四)最简单的三阶魔方入门教程——中层还原...

本系列教程适合刚刚接触魔方,又比较有好奇心,是为渴望学会还原魔方,又不想死记公式的人准备的。全部教程只使用三种公式,还原过程以理解为主,公式为辅。第四部分 中层棱块还原4.1 预览中层棱块还原后的效果中层还原以后…

吞吐量-Corda的故事

我最近开展了一个针对特定用例的Corda性能项目。 这个项目的结果使我们在170多个节点的网络上一天之内处理了1.15亿个请求。 此外,Corda每秒能够处理6300个请求,确认满足了网络的最高要求。 迄今为止,这是迄今为止已部署的最大的Corda网络&am…

httpurlconnect设置中文参数_数控三菱CNC机床参数的设置及报警解除!

数控三菱CNC的硬件连接检查与设置执行完毕向系统送电后,显示器上的READY绿灯仍然不亮。而且在〔诊断〕――〔报警〕 画面上显示很多报警内容,哪些是开机时必须设置的呢?又如何解除故障报警呢?1.开机参数1.1 基本参数的设置原装系统…

计算机如何更新苹果系统,苹果系统怎么更新_苹果电脑mac如何更新升级系统-win7之家...

苹果电脑跟windows系统一样,也是会在发布之后不断的推送新版本让用户们进行升级,不仅可以修复bug还可以增加新功能,不过很多用户可能都会有一个疑问,就是苹果系统怎么更新呢?方法并不难,本文给大家讲述一下…

手术步骤_近视飞秒激光手术和传统Lasik手术比较

传统LasikLASIK手术操作时分为两个步骤:第一个步骤医生需要制作一个角膜瓣;第二个步骤是掀开角膜瓣,以准分子激光雕琢角膜,进行视力矫正,雕琢完毕后将角膜瓣复位即手术完成。传统的角膜制瓣是用机械式的设备与一个微型…

jenkins部署java_在Window上使用Jenkins自动部署和上传快照Java工件

jenkins部署java这篇文章将展示如何使用Jenkins Continuous Integration自动执行Java Web应用程序(使用MYSQL DB和基于Hibernate ORM在基于REST的Jersey2 Spring环境中开发的学生申请应用程序)的部署过程-生成项目,运行单元测试,上…

苹果电脑怎么更换计算机模式,图文详解苹果电脑如何切换成windows系统

苹果电脑默认安装的是Mac系统,有的人很喜欢,有一部分人却怎么都用不习惯,觉得windows系统用起来比较顺手。为了能提高办公效率,给苹果电脑安装双系统,那么有什么办法能将苹果电脑切换成windows系统?方法当然…

input内的字体颜色_嘉兴市硅胶喷涂颜色油订制

嘉兴市硅胶喷涂颜色油订制,博越硅胶服务惠万家,欢迎惠顾。嘉兴市硅胶喷涂颜色油订制, 而它配合硅胶原材制作时是按照相应的比例来进行分配在加上硫化剂的配合才能够得到制作产品的原材料,色母的性能选择也影响着一个产品的性能&am…

计算机部件动漫,因一个片段肝了整部番,电脑配件上榜,它满屏“虎狼之词”...

原标题:因一个片段肝了整部番,电脑配件上榜,它满屏“虎狼之词”现在的动漫行业格外迎来了鼎盛时期,就连以前不被看好的国漫最近几年也是突飞猛进。一部动漫想要有人看,就必定有自己的亮点,甚至一句话一个场…

获取周一_Ace足球网冬至版周一推介

WINTER SOLSTICE冬至冬至又称“冬节”、“贺冬”,华夏二十四节气之一、八大天象类节气之一,与夏至相对。Ace足球网祝全体球友冬至快乐身体健康 波运亨通Lorem Ipsum周一推介微信支付失败,请使用支付宝购买推介后请与Ace客服联系获取推介请勿相信其他客服…

oauth2和jwt_使用具有OAuth2的Web应用程序和JWT的使用来调用API – WSO2 API Manager

oauth2和jwt在这篇文章中,我将分享我在WSO2 API管理器(API-M)中针对行业中非常常见且有用的场景的经验和理解。 简要地说明以下流程。 公开了一个API,供应用程序开发人员在API管理器的控制下使用(这增加了对该API的访…

android listview 去掉水波纹效果_CocosCreator之分层管理的ListView

前言进入公众号回复listview即可获得demo的git地址。之前写的一篇文章《Creator之ScrollView那些事》中提到了官方Demo中提供的ListViewCtl,只是实现了纵向滑动,没有实现横向滑动。并且建议官方可以把功能做全然后放入组件库中供开发者使用。然后有个牛逼大神说这个…