`

使用Externalization更高效的实现java对象序列化

    博客分类:
  • Java
阅读更多
Externalization没用过, 它通过牺牲默认序列化的灵活性来获得高性能. 在某些场景下可以采用这种方式, 这里是一个例子:
package com.javacodegeeks.test;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class Employee implements Externalizable {

 private String firstName;
 private String lastName;
 private String socialSecurityNumber;
 private String department;
 private String position;
 private Date hireDate;
 private Double salary;
 private Employee supervisor;
 private List<string> phoneNumbers;
 
 public Employee() {
 }
 
 public Employee(String firstName, String lastName,
   String socialSecurityNumber, String department, String position,
   Date hireDate, Double salary) {
  this.firstName = firstName;
  this.lastName = lastName;
  this.socialSecurityNumber = socialSecurityNumber;
  this.department = department;
  this.position = position;
  this.hireDate = hireDate;
  this.salary = salary;
 }

 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

 public String getSocialSecurityNumber() {
  return socialSecurityNumber;
 }

 public void setSocialSecurityNumber(String socialSecurityNumber) {
  this.socialSecurityNumber = socialSecurityNumber;
 }

 public String getDepartment() {
  return department;
 }

 public void setDepartment(String department) {
  this.department = department;
 }

 public String getPosition() {
  return position;
 }

 public void setPosition(String position) {
  this.position = position;
 }

 public Date getHireDate() {
  return hireDate;
 }

 public void setHireDate(Date hireDate) {
  this.hireDate = hireDate;
 }

 public Double getSalary() {
  return salary;
 }

 public void setSalary(Double salary) {
  this.salary = salary;
 }

 public Employee getSupervisor() {
  return supervisor;
 }

 public void setSupervisor(Employee supervisor) {
  this.supervisor = supervisor;
 }

 public List<string> getPhoneNumbers() {
  return phoneNumbers;
 }

 public void setPhoneNumbers(List<string> phoneNumbers) {
  this.phoneNumbers = phoneNumbers;
 }

 public void readExternal(ObjectInput objectInput) throws IOException,
   ClassNotFoundException {
  
  this.firstName = objectInput.readUTF();
  this.lastName = objectInput.readUTF();
  this.socialSecurityNumber = objectInput.readUTF();
  this.department = objectInput.readUTF();
  this.position = objectInput.readUTF();
  this.hireDate = new Date(objectInput.readLong());
  this.salary = objectInput.readDouble();
  
  int attributeCount = objectInput.read();

  byte[] attributes = new byte[attributeCount];

  objectInput.readFully(attributes);
  
  for (int i = 0; i < attributeCount; i++) {
   byte attribute = attributes[i];

   switch (attribute) {
   case (byte) 0:
    this.supervisor = (Employee) objectInput.readObject();
    break;
   case (byte) 1:
    this.phoneNumbers = Arrays.asList(objectInput.readUTF().split(";"));
    break;
   }
  }
  
 }

 public void writeExternal(ObjectOutput objectOutput) throws IOException {
  
  objectOutput.writeUTF(firstName);
  objectOutput.writeUTF(lastName);
  objectOutput.writeUTF(socialSecurityNumber);
  objectOutput.writeUTF(department);
  objectOutput.writeUTF(position);
  objectOutput.writeLong(hireDate.getTime());
  objectOutput.writeDouble(salary);
  
  byte[] attributeFlags = new byte[2];
  
  int attributeCount = 0;
  
  if (supervisor != null) {
   attributeFlags[0] = (byte) 1;
   attributeCount++;
  }
  if (phoneNumbers != null && !phoneNumbers.isEmpty()) {
   attributeFlags[1] = (byte) 1;
   attributeCount++;
  }
  
  objectOutput.write(attributeCount);
  
  byte[] attributes = new byte[attributeCount];

  int j = attributeCount;

  for (int i = 0; i < 2; i++)
   if (attributeFlags[i] == (byte) 1) {
    j--;
    attributes[j] = (byte) i;
   }

  objectOutput.write(attributes);
  
  for (int i = 0; i < attributeCount; i++) {
   byte attribute = attributes[i];

   switch (attribute) {
   case (byte) 0:
    objectOutput.writeObject(supervisor);
    break;
   case (byte) 1:
    StringBuilder rowPhoneNumbers = new StringBuilder();
    for(int k = 0; k < phoneNumbers.size(); k++)
     rowPhoneNumbers.append(phoneNumbers.get(k) + ";");
    rowPhoneNumbers.deleteCharAt(rowPhoneNumbers.lastIndexOf(";"));
    objectOutput.writeUTF(rowPhoneNumbers.toString());
    break;
   }
  }
  
 }
}


这里是序列化的处理:
public static byte[][] serializeObject(Externalizable object) throws Exception {
  ByteArrayOutputStream baos = null;
  ObjectOutputStream oos = null;
  byte[][] res = new byte[2][];
  
  try {
   baos = new ByteArrayOutputStream();
   oos = new ObjectOutputStream(baos);
   
   object.writeExternal(oos);
   oos.flush();
   
   res[0] = object.getClass().getName().getBytes();
   res[1] = baos.toByteArray();
  
  } catch (Exception ex) {
   throw ex;
  } finally {
   try {
    if(oos != null)
     oos.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  
  return res;
 }
 


这里是反序列化的处理:
public static Externalizable deserializeObject(byte[][] rowObject) throws Exception {
  ObjectInputStream ois = null;
  String objectClassName = null;
  Externalizable res = null;
  
  try {
   
   objectClassName = new String(rowObject[0]);
   byte[] objectBytes = rowObject[1];
   
   ois = new ObjectInputStream(new ByteArrayInputStream(objectBytes));
   
   Class objectClass = Class.forName(objectClassName);
   res = (Externalizable) objectClass.newInstance();
   res.readExternal(ois);
  
  } catch (Exception ex) {
   throw ex;
  } finally {
   try {
    if(ois != null)
     ois.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
   
  }
  
  return res;
  
 }
 
分享到:
评论

相关推荐

    Java IO, NIO and NIO.2 原版pdf by Friesen

    and externalization) and writers/readers. Chapters 6 through 11 focus on NIO. You explore buffers, channels, selectors, regular expressions, charsets, and formatters. (Formatters were not introduced ...

    Python库 | nti.externalization-1.1.3.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:nti.externalization-1.1.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    软件开发中的模式技术讲义

    模式技术在软件开发中扮演着至关重要的角色,它是一种提炼并分享最佳实践的方式,通过将成功的解决方案标准化,以便于在不同的项目中重复使用。模式技术的精髓在于将个体或团队的经验转化为可复用的知识,这与知识...

    Externalizer-开源

    外部化(Externalization)在软件开发中是一种重要的设计原则,特别是在处理字符串和配置信息时。标题提到的"Externalizer-开源"是一个专为实现这一目标的Ant任务。Ant是Apache软件基金会开发的一个Java构建工具,它...

    基于SECI模型的网络数据挖掘系统优化设计.pdf

    这不仅涉及到硬件的升级和算法的改进,也涉及到系统模块中的统一操作,以确保硬件设备的操作统一化,使数据采集、预处理、分析和挖掘等步骤更流畅高效地进行。 实验验证了优化后的网络数据挖掘系统在精准度方面的...

    第二章知识管理系统的规划.pptx

    SECI模型,全称为社会化(Socialization)、外部化(Externalization)、组合化(Combination)和内部化(Internalization),由野中郁次郎和竹內弘高在1995年的著作《The Knowledge-Creating Company》中提出。该模型强调...

    MIS筆記(高手寫)

    - **信息技术的演进**:从早期的大型机到当前的云计算和大数据,IT技术不断进步,为企业提供了更高效的数据处理和分析能力。 - **数据库与数据仓库**:数据库用于存储和管理结构化数据,而数据仓库则侧重于数据分析...

    基于SECI模型促进教师深度学习的培训路径分析及策略研究.pdf

    该模型将知识创造过程分为四个阶段,即社会化(Socialization)、外显化(Externalization)、组合化(Combination)、内隐化(Internalization)。这四个阶段构成了一个螺旋上升的循环,知识在这个循环过程中不断被...

    知识管理系统的规划.pptx

    2. 外部化(Externalization):这个过程涉及将个人的隐性知识转化为显性知识,通常通过比喻、类比、概念和模型等表达方式。在商业中,这可能表现为将专家或客户的专业知识转化为易于理解的形式。 3. 组合化...

    大数据环境下基于SECI模型的动态知识创造与转化研究.zip

    在大数据中,这可能涉及到将数据挖掘结果进行可视化展示,或者通过编程语言实现数据分析模型。 3. 组合(Combination):这一阶段是将多种显性知识整合,以形成新的知识结构或解决方案。大数据环境下的组合可能包括...

    知识管理ppt模板下载

    "知识管理ppt模板下载"是一个专门针对这一需求的资源,提供了一系列预设计的PPT模版,帮助用户更高效地制作关于知识管理的演示文稿。 在设计知识管理的PPT时,通常会包含以下几个关键知识点: 1. **知识的分类**:...

    真实世界里的面向服务架构(SOA)

    6. **过程外部化**(Process Externalization): 将业务逻辑从业务应用程序中分离出来,实现更加灵活的流程调整。 #### 六、SOA的案例研究 例如,在**澳大利亚联邦银行**(Commonwealth Bank of Australia)的例子...

    项目型企业内部知识转移机理研究--以建筑企业为例

    SECI模型是研究知识创造和转移的核心理论之一,它将知识的转移和创造过程分为四个阶段:社会化(Socialization)、外部化(Externalization)、组合化(Combination)和内部化(Internalization)。该模型最初由日本...

    知识管理与电子商务.pptx

    知识创造的过程,Nonaka & Takeuchi 提出了“SECI”模型,即社会化(Socialization)、外部化(Externalization)、结合化(Combining)和内部化(Embodying)。这个模型描述了隐性知识和显性知识之间的动态交互,...

    让SECI模式走进旅游高等教育教学课堂

    【SECI模式与旅游高等教育教学】\n\nSECI模式,全称为社会化(Socialization)、外在化(Externalization)、组合化(Combination)和内隐化(Internalization)模式,是由日本学者野中郁次郎(Ikujiro Nonaka)和竹内弘高...

    第五章知识管理系统的转化--知识加工与存储.pptx

    社会化过程将个人经验转化为共享知识,外部化是将隐性知识显性化,组合则是将多种知识整合,内部化是将新知识内化为个人能力。 然而,知识共享面临诸多挑战。知识本身的复杂性,如背景依赖性、动态性、多维性及隐性...

    以代理人技术为基础之知识管理系统架构.doc

    Nonaka提出的SECI模型包括社会化(Socialization)、外化(Externalization)、组合化(Combination)和内化(Internalization)四个过程,通过这些过程促进知识在个人与组织间的流动和转化。 知识管理系统的构建...

Global site tag (gtag.js) - Google Analytics