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
关注公众号:嗅谱网

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!