Java的对象序列化

(一)关于序列化

(1)什么是序列化

将一个java 对象变成字节流的形式传出去或者从一个字节流中恢复成一个java 对象。例如,要将java 对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java 对象变成某个格式的字节流再传输,但是,jre 本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java帮我们做,要被传输的对象必须实现serializable或Externalizable接口,这样,javac 编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。

(2)序列化的作用

在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。譬如通过网络传输,或者把一个对象保存成一个文件的时候,要实现序列化接口。例如

①在web 开发中,如果对象被保存在了Session 中,tomcat 在重启时要把Session对象序列化到硬盘,这个对象就必须实现serializable或Externalizable接口。

②如果对象要经过分布式系统进行网络传输或通过rmi 等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现serializable或Externalizable接口。

(3)序列化的使用

需要被序列化的类可实现两个接口之一:①实现Serializable接口;②实现Externalizable接口。

 

(二)方法一:实现Serializable接口的

(1)非自定义

①定义一个Person类:无需通过构造器初始化对象

public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public Person(String name, int age) {this.name = name;
        this.age = age;
    }

    //省略Get、Set.....

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

}

②Java的IO方法

   /**
     * 序列化JAVA对象
     */
    @Test
    public void writeObjectTest(){
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/RUNNING_COPY.txt"));
            oos.writeObject(new Person("Winson", 26));
            oos.writeObject(new Person("Tom", 35));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 反序列化读取JAVA对象
     */
    @Test
    public void readObjectTest(){
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/RUNNING_COPY.txt"));
            //按顺序读取
            System.out.println((Person) ois.readObject());
            System.out.println((Person) ois.readObject());
    }

(2)自定义序列化

Person提供readObject和writeObject方法,方法内保存Person对象,序列化和反序列化的方法要一致

    private void writeObject(java.io.ObjectOutputStream out){
            out.writeObject(new StringBuffer(name).reverse());
            out.writeInt(age);
    }

    private void readObject(java.io.ObjectInputStream in){this.name=(((StringBuffer)in.readObject()).reverse()).toString();
            this.age=in.readInt();
    }

(三)方法二:实现Externalizable接口,重写两个接口(和上面的自定义序列化类似),必须提供无参构造器

public class Student implements Externalizable {

    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    // 必须提供无参构造器
    public Student() {}

    public Student(String name, int age) {this.name = name;
        this.age = age;
    }

    //省略Get、Set方法

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {this.name = (((StringBuffer) in.readObject()).reverse()).toString();
            this.age = in.readInt();
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
            out.writeObject(new StringBuffer(name).reverse());
            out.writeInt(age);
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

}

(四)总结

(1)Serizlizable

①无需提供构造器

②可实现自定义序列化,提供writeObject、readObject方法

(2)Externalizable

①必须提供无参构造器

②必须重写writeExternal、readExternal

(3)OutputSteam和InputSteam

①创建流

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/RUNNING_COPY.txt"));  //输入
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/RUNNING_COPY.txt"));  //输出

②输入可序列化对象,writeObject()

oos.writeObject(new Person("Winson", 26));
oos.writeObject(new Person("Tom", 35));
oos.writeObject(new Student("Hello", 78));
oos.writeObject(new Student("Mary", 80));

③输出可序列化对象:必须按写入顺序读取readObject()

System.out.println((Person) ois.readObject());
System.out.println((Person) ois.readObject());
System.out.println((Student) ois.readObject());
System.out.println((Student) ois.readObject());
时间: 2024-11-10 11:34:45

Java的对象序列化的相关文章

Java Object 对象序列化和反序列化

Java Object 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制(深拷贝):在一些分布式应用中,我们还可以把对象的字节流发送到网络上的其他计算机. 反序列化是把流结构的对象恢复为其原有形式 2.Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但

Java Object 对象序列化后的文件格式

Java Object 对象序列化后的文件格式 @author ixenos 1.文件开头: AC ED 2.序列化格式版本示例: 00 05 3.字符串对象示例: 74 2字节表示的字符串长度 字符串: 74 00 05 ixenos 4.类序列化示例:当存储一个对象时,其类也被存储: 类名 序列化版本号ID指纹 序列化方法 数据域 72 2字节的类名长度 类名 8字节的指纹 1字节的标志 //由在java.io.ObjectStream.Constant中定义的三位掩码(三个字节常量)构成

【java】对象序列化Serializable

1 package 对象序列化; 2 3 import java.io.Serializable; 4 5 @SuppressWarnings("serial") 6 class A implements Serializable{ 7 8 } 9 public class TestSerializable { 10 public static void main(String[] args) { 11 12 } 13 } 对象序列化:java.io.ObjectOutputStrea

【Java】对象序列化中出现的java.io.StreamCorruptedException异常

今天在试验对象序列化,看到在类继承了Serializable接口,还有两个函数会在对象序列化及反序列化时默认自动执行,分别是writeObject和readObject. 进行了简单的试验,发现在在程序执行过程中出现了下述异常: java.io.StreamCorruptedException: invalid type code: 00 at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1520) at java

面试题:Java中对象序列化接口(Serializable)的意义

Serializable接口是一个里面什么都没有的接口 它的源代码是public interface Serializable{},即什么都没有. 如果一个接口里面什么内容都没有,那么这个接口是一个标识接口,比如,一个学生遇到一个问题,排错排了几天也没解决,此时,她举手了(示意我去帮他解决),然后我过去,帮他解决了,那么这个举手其实就是一个标识,自己不能解决的问题标示我去帮他解决,在Java中的这个Serializable接口是给JVM看的,告诉JVM,我不做这个类的序列化了,你(JVM)给我序

java对象序列化小结

百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据.确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission.在默认策略下,通过 Internet 下载

JAVA 对象序列化——Serializable

1.序列化是干什么的?       简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化. 2.什么情况下需要序列化       a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候:    b)当你想用套接字在网络上传送对象的时候:    c)当你想通过RMI传输对象的时候: 3.当对一个对象

对象序列化与反序列化

1)要想让一个对象成为序列化对象,那么这个类就要实现Serializable或Externalizable接口(Externalizable接口继承与Serializable接口), 这种序列化仅对对象的 非transient 的实例变量进行序列化,不会对静态成员变量序列化,也不会对方法序列化 2) 对象序列化:把java“对象”转换成“字节序列”的过程称为对象序列化 对象反序列化:把“字节序列”恢复成java“对象”的过程称为反序列化 在反序列化时不会调用类的任何构造方法 3) 对象序列化的功

Java Object JDK序列化总结

Java Object JDK序列化总结 @author ixenos Java序列化是在JDK 1.1中引入的,是Java内核的重要特性之一.Java序列化API允许我们将一个对象转换为流,并通过网络发送,或将其存入文件或数据库以便未来使用,反序列化则是将对象流转换为实际程序中使用的Java对象的过程.Java同步化过程乍看起来很好用,但它会带来一些琐碎的安全性和完整性问题,在文章的后面部分我们会涉及到,以下是本教程涉及的主题. Java序列化接口 使用序列化和serialVersionUID