Java序列化

作者: JWking | 来源:发表于2019-07-22 10:51 被阅读0次

        Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化。简洁点说,Java序列化的流程为“对象->字节序列->对象”。

    注意:一个类的对象要想序列化成功,必须满足两个条件:

    该类必须实现 java.io.Serializable 对象。

    该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。

    下面为Java代码实例

    Java序列化

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.ObjectOutputStream;

    //Java序列化

    public class Person_SerializeTest {

    public Person_SerializeTest(){

    Person person =new Person();                  //申明Person对象person

    person.name ="张三";                                //添加属性值

    person.sex ="男";

    person.age =18;

    person.number =110;

    try{

    //新建文件Person.ser

    FileOutputStream fileout =new FileOutputStream("C:/Users/My/IdeaProjects/Java_Serialization/Person.ser");

    ObjectOutputStream out =new ObjectOutputStream(fileout);

    out.writeObject(person);                       //将对象序列化,即将对象及其信息写进.ser文件

    out.close();

    fileout.close();

    System.out.print("序列化成功,保存在C:/Users/My/IdeaProjects/Java_Serialization/Person.ser");

    }catch(IOException i){

    i.printStackTrace();

    }

    }

    }

    运行结果如下:

    注意: 当序列化一个对象到文件时, 按照 Java 的标准约定是给文件一个 .ser 扩展名。

    Java反序列化

    import java.io.FileInputStream;

    import java.io.IOException;

    import java.io.ObjectInputStream;

    //Java反序列化

    public class Person_DeserializeTest {

    public Person_DeserializeTest(){

    Person person =new Person();                //申明Person对象

    try{

    //读取文件Person.ser

    FileInputStream filein =new FileInputStream("C:/Users/My/IdeaProjects/Java_Serialization/Person.ser");

    ObjectInputStream in =new ObjectInputStream(filein);

    person = (Person)in.readObject();        //反序列化,即读取对象及其相关信息

    in.close();

    filein.close();

    }catch (IOException i){

    i.printStackTrace();

    return;

    }catch (ClassNotFoundException c){

    System.out.print("未找到文件");

    c.printStackTrace();

    return;

    }

    System.out.print("姓名:"+person.name+"\n性别:"+person.sex+"\n年龄:"+person.age+"\n号码:"+person.number);

    }

    }

    运行结果如下:

    注意:readObject() 方法中的 try/catch代码块尝试捕获 ClassNotFoundException 异常。对于 JVM 可以反序列化对象,它必须是能够找到字节码的类。如果JVM在反序列化对象的过程中找不到该类,则抛出一个 ClassNotFoundException 异常,在该实例中readObject() 方法的返回值被转化成 Employee 引用。另外,因为属性number是短暂的,该值没有被发送到输出流,所以反序列化后 Employee 对象的 number 属性为 0。

    相关文章

      网友评论

        本文标题:Java序列化

        本文链接:https://www.haomeiwen.com/subject/eqqilctx.html