首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java 序列化【笔记】

Java 序列化【笔记】

作者头像
程序媛淼淼
发布于 2022-07-01 14:38:30
发布于 2022-07-01 14:38:30
4550
举报
文章被收录于专栏:程序员阿常程序员阿常

标语: 追着光,靠近光,成为光,然后散发光!

今天给大家分享【Java 序列化】。

一、Java序列化的概念:

序列化,又称持久化,将字节序列写入磁盘中。

将序列化对象写入文件后,可从文件中读取出来,则称之为反序列化。

二、序列化一个对象:

前置条件:

一个类想要序列化,必须满足两个条件:

1、实现 Serializable 接口。

2、该类的属性必须是可序列化的,不想将所有的属性都进行序列化,用关键字 transient。

代码语言:javascript
复制
public class Family implements java.io.Serializable//实现 Serializable 接口
{
public String nickname;
public String hobby;
   public String job;
   public transient int no;//属性标明是短暂的,不可序列化
public void hobby()
{
      System.out.println(nickname+ "'s hobby is "
                           + hobby);
   }
}

序列化对象

代码语言:javascript
复制
import java.io.*;

public class Demo1
{
public static void main(String [] args)
   {
      Family f= new Family ();
      f.nickname = "Tester Achang";
      f.hobby = "yoga";
      f.job= "system testing";
      f.no = 89757;
try
      {
         FileOutputStream fileOut =
new FileOutputStream("/Serializedata/family.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);//ObjectOutputStream是序列化流,可以将Java程序中的对象写到文件中。
         out.writeObject(f);//ObjectOutputStream写对象的方法(特有方法):void writeObject(Object obj):向文件中写对象。
out.close();
         fileOut.close();
         System.out.printf("Data is saved in /Serializedata/family.ser");
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

Notes:

1、ObjectOutputStream(OutputStream out):参数要传递字节输出流。

2、ObjectOutputStream 的使用步骤:

  1. 创建序列化流,用来写。
  2. 调用 writeObject 方法,写对象。
  3. 释放资源。

三、反序列化一个对象:

反序列化对象

代码语言:javascript
复制
import java.io.*;

public class Demo2
{
public static void main(String [] args)
   {
      Family f = null;
try
      {
         FileInputStream fileIn = new FileInputStream("/Serializedata/family.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);//ObjectInputStream 是反序列化流, 可以将文件中的对象读取到 Java 程序中。
         f = (Family) in.readObject();//Object readObject():从文件中读取对象,并将该对象返回。
in.close();
         fileIn.close();
      }catch(IOException i)
      {
         i.printStackTrace();
return;
      }catch(ClassNotFoundException c)
      {
         System.out.println("Class Family has not been found");
         c.printStackTrace();
return;
      }
      System.out.println("Deserialized Family...");
      System.out.println("Nickname: " + f.nickname);
      System.out.println("Hobby: " + f.hobby);
      System.out.println("Job: " + f.job);
      System.out.println("No: " + f.no);
    }
}

执行以上实例,输出结果为:

代码语言:javascript
复制
Deserialized Family...
Nickname:Tester Achang
Hobby:yoga
job:system testing
N0:0

Notes:

1、当 Family 对象被序列化时,属性 No 的值为 89757,但该属性是短暂的,该值没有被发送到输出流,所以反序列化后 Family 对象的 No属性为 0。

2、ObjectInputStream(InputStream in):参数要传递字节输入流。

3、ObjectInputStream 的步骤:

  1. 创建 ObjectInputStream 反序列化流。
  2. 调用 readObject 方法,读取对象。
  3. 释放资源。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档