Serializable , Externalizable接口的区别
同样对于对象序列化的实现,Serializable , Externalizable接口的区别:
1.实现:前者简单、系统内建支持,后者复杂,由开发人员完成;
2.效率:前者保存所有对象,性能较低,后者由人工决定,可能获得提升;
3.空间:前者保存占用空间大,后者部分保存,可能减少空间;
一般,前者使用较多,方便;
—–transient关键字:
该关键字,可以声明类的属性不参加自动序列化操作,意味着可以代替Externalizable接口;
transient 与 Serializable结合;
————- 多对象序列化、反序列化的操作:
package com.mldn;
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectInput;
import java.io.IOException;
public class SeriDemo
{
public static void main(String[] args) throws IOException, ClassNotFoundException
{
Object[] obj = {new Person(“张三”, 20), new Person(“李四”, 30), new Person(“王五”, 27)}; // 实例化对象数组
seri(obj); // 测试序列化
Object[] obj1 = dseri(); // 测试反序列化
Person[] per = new Person[obj1.length]; // 定义对象数组
for (int x = 0; x < obj1.length; x++)
{
per[x] = (Person)obj1[x]; // 向下转型
System.out.println(per[x]);
}
}
public static void seri(Object obj) throws IOException // 对象序列化 Object 可以接收 Object[]!
{
String path = File.separator + “home” + File.separator + “administrator” + File.separator + “object.txt”;
File file = new File(path);
OutputStream out = null; // 声明字节输出流
ObjectOutputStream oos = null; // 声明对象字节输出流
out = new FileOutputStream(file); // 实例化文件字节输出流
oos = new ObjectOutputStream(out); // 实例化对象字节输出流
oos.writeObject(obj); // 写对象
oos.close();
//out.write(1); // 测试是否被关闭
}
public static Object[] dseri() throws IOException, ClassNotFoundException// 反序列化
{
String path = File.separator + “home” + File.separator + “administrator” + File.separator + “object.txt”;
File file = new File(path);
InputStream in = null; // 声明字节输入流
ObjectInputStream ois = null; // 声明对象字节输入流
in = new FileInputStream(file); // 实例化文件字节输入流
ois = new ObjectInputStream(in);// 实例化对象字节输入流
Object[] obj = (Object[])ois.readObject(); // 读取对象数组,向下转型
System.out.println(“读取序列化对象成功:”);
ois.close(); // 关闭对象输入流
return obj; // 返回对象数组
}
}
// Person类用于测试序列化、反序列化操作
class Person implements java.io.Serializable // 实现自动序列化接口!
{
private String name = null;
private int age = 0;
private static final transient long serialVersionUID = 1l;
public Person()
{
// 实现手工序列化时必须实现类的无参构造,这是反序列化时要调用的,否则会出现找不到类异常;
}
public Person(String name, int age)
{
this.name = name;
this.age = age;
}
public String toString()
{
return “姓名:” + this.name + ” 年龄:” + this.age;
}
}
/*
administrator@xu-desktop:~$ java com.mldn.SeriDemo
读取序列化对象成功:
姓名:张三 年龄:20
姓名:李四 年龄:30
姓名:王五 年龄:27
—- 看来采用对象数组可以很好的解决对多对象的写、和读操作;
Object对象可以引用所有引用类型,可以接收对象数组,当然可以接收Object[];
注意其中的向下转型;
*/
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《Serializable , Externalizable接口的区别》
本文地址:http://www.xiupu.net/archives-106.html
关注公众号:
微信赞赏
支付宝赞赏