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,一经查实,立即删除!

相关文章

[渝粤教育] 西南科技大学 电子设计EDA 在线考试复习资料

电子设计EDA——在线考试复习资料 一、单选题 1. 执行菜单命令( ),用户可以选定某个元件,使程序只对与该元件相连的网络进行自动布线。 A.uto Routing/All B.uto Routing/Net C.uto Routing/Connection D.uto Routing/Component 2.对选中元件进行逆时针旋转,可以按( )。 A…

[渝粤教育] 西南科技大学 管理信息系统 在线考试复习资料(1)

管理信息系统——在线考试复习资料 一、单选题 1.系统转换是在( ) A.系统分析阶段 B.系统设计阶段 C.系统实施阶段 D.系统规划阶段 2.系统设计包括多项内容,下述哪一项是系统设计最基础性的工作?( ) A.代码设计 B.屏幕设计 C.输入设计 D.输出设计 3.用决策树描述处理逻辑是在…

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

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

计算机网络的权威杂志,科学网—晒个自己整理的计算机网络和通信方向可能相关的期刊列表...

晒个自己整理的计算机网络和通信方向可能相关的期刊列表已有 3051 次阅读2010-1-14 13:42|个人分类:论文交流|系统分类:论文交流|关键词:网络,通信,国际期刊列表1 ACM的期刊列表 51.1. Communication of the ACM (http://cacm.acm.org/)1.2. NetWorker h…

[渝粤教育] 西南科技大学 经济法概论 在线考试复习资料2021版(3)

经济法概论——在线考试复习资料2021版 一、单选题 1.债务人放弃其到期债权,致使债务人无法清偿债权人的债权,债权人可以行使( )。 A.解除权 B.撤销权 C.代位权 D.抵消权 答案:看左边查询 2.在代位权诉讼中,债务人的诉讼地位是( )。 A.原告 B.被告 C.有独立请求权的第三人 D…

[渝粤教育] 西南科技大学 英语语法1 在线考试复习资料

英语语法1——在线考试复习资料 一、单选题 1.I was arguing with Cathy,Justin came in and took sides with her. A.when B.while C.the moment D.since 2.Though he is a five-year-old boy, helike a child. A.objects to be treated B.objects to being treated C.object…

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…

[渝粤教育] 西南科技大学 语文教材教法 在线考试复习资料2021版

语文教材教法——在线考试复习资料2021版 一、单选题 1.语文智育教育的内容包括哪些方面?阐述不正确的是: A.培养学术能力 B.培养记忆力 C.培养观察力 D.培养注意力 答案:看左边查询 2.考查与考试都不具有的功能:( ) A.评定功能 B.诊断功能 C.训练功能 D.反馈功能 答案:看…

[渝粤教育] 西南科技大学 钢结构 在线考试复习资料

钢结构——在线考试复习资料 一、单选题 1.屋盖支撑的主要作用是( )。 A.保证结构的空间刚度 B.增加屋架的侧向稳定 C.传递屋盖的水平荷载 D.便于屋盖的安全施工和A,B,C 2.钢结构实腹式压弯构件一般应进行的计算内容为( )。 A.强度、弯矩作用平面外的整体稳定性、局部稳定、…

账户与使用计算机的人无关,本地用户和组

本地用户和组用户账户的概述:用户账户是计算机的基本安全组件,计算机通过用户账户来辨别用户身份,让有使用权限的人登录计算机,访问本地计算机资源或从网络访问者台计算机的共享资源。Windows Server 2008 支持两种用户账户&#…

【渝粤教育】电大中专成本会计_1作业 题库

1.下列关于产品成本计算制度的表述错误的是()。 A.标准成本计算制度下只能提供标准成本无法提供实际成本 B.完全成本计算制度下生产制造过程的全部成本都计入产品成本 C.产量基础成本计算制度是以产品数量,或者与产品数量有密切关系的人工成本…

spring 文件变化监听_Spring新变化

spring 文件变化监听让我们检查一下Spring社区在前几天发布的一些新版本: Spring Boot 1.0.0.RC1 Spring很高兴地宣布Spring Boot v1.0.0的第一个候选版本。 它包含了先前里程碑中的许多错误修复和增强功能。 二进制文件已发布到Spring Maven存储库 。 项目页面将…

奥鹏计算机基础18秋在线作业答案,18秋华师《计算机基础》在线作业1(标准答案).doc...

【奥鹏】[华中师范大学]华师《计算机基础》在线作业试卷总分:100 得分:100第1题,下列四组数依次为二进制、八进制和十六进制,符合要求的是____。A、11,78,19B、12,77,10C、12,80,10D、11&#x…

【渝粤教育】电大中专消费者心理学答案作业 题库

1.在西方,早期思想家也有论及消费时令和消费季节的朴素思想。该说法( ) A.错误 B.正确 正确 正确答案:左边查询 学生答案:A 2.体系凝构阶段大致自20世纪70年代延至20世纪末或21世纪初。该说法( &#xff09…

【渝粤教育】电大中专电商运营实操 (8)作业 题库

1.电子商务具有全球性特点,不受空间的限制,但受时间的限制。 ( ) A.正确 B.错误 错误 正确答案:左边查询 学生答案:未作答 2.电子商务最重要的是“商务”,而网站只不过是电子商务的后台支撑。 &…

【渝粤教育】电大中专电子商务网站建设与维护 (8)作业 题库

1.阿里巴巴的创始人是( ) A.丁磊 B.李彦宏 C.马化腾 D.马云 错误 正确答案:左边查询 学生答案:未作答 2.阿里巴巴目前的电子商务在哪个阶段( ) A.资金流 B.物流 C.商品流 D.信息流 错误 正确答案&#xff1…

Java安全动画

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

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

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

vb 发送html邮件,【VB】邮件发送功能

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Email.cls代码:Private mUserName As StringPrivate mPassWord As StringPrivate mSmtpServer As StringPrivate mAttachCount As IntegerPrivate mAttachFilePath() As StringPrivate Sub Class_Initialize()mAttachCo…

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

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