您的位置:首页 > 编程语言 > Java开发

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

2012-04-04 22:38 741 查看
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;

}
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: