主页 > 新闻资讯 > 大数据编程入门:Java序列化

大数据编程入门:Java序列化

作者:游老师 浏览次数: 2021-08-02 14:35
在Java中提供了一种对象序列化机制,今天小编将为大家带来大数据编程入门:Java序列化这篇文章来介绍序列化及反序列化。
一、序列化概念
Java提供了一种对象序列化的机制,在这种机制中,对象可以表示为字节序列,其中包括对象的数据、关于对象类型的信息以及存储在对象中的数据类型。
将序列化对象写入文件后,可以从文件中读取并反序列化该对象,也就是说,可以使用对象中的对象类型信息、对象数据和数据类型在内存中创建新对象。
整个过程是独立于Java虚拟机(JVM)的,也就是说,在一个平台上序列化的对象可以在完全不同的平台上反序列化。
类ObjectInputStream 和 ObjectOutputStream是高级数据流,包含反序列化和序列化对象的方法。
ObjectOutputStream类包含许多写入方法来写入各种数据类型,但有一个特殊的例外:
public final void writeObject(Object x) throws IOException
上面的方法序列化对象并将其发送到输出流。类似的ObjectInputStream类包含以下反序列化对象的方法:
public final Object readObject() throws IOException,
                                 ClassNotFoundException
此方法从流中获取下一个对象并反序列化该对象。它的返回值是Object,因此需要将其转换为适当的数据类型。
为了演示序列化在Java中是如何工作的,以下示例中将会使用上图的Employee类,假设我们定义了以下Employee类,它实现了Serializable接口。
public class Employee implements java.io.Serializable
{
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + name
                           + " " + address);
   }
}
请注意,要想成功序列化一个类的对象,必须满足两个条件:
此类必须实现java.io.Serializable接口。
此类的所有属性都必须可序列化。如果属性不可序列化,则该属性必须指示它是瞬态的。
如果您想知道Java标准类是否可序列化,请查看类文档。检查类的实例是否可以序列化非常简单。您只需要检查该类是否实现了java.io.Serializable接口。
二、序列化对象
ObjectOutputStream类用于序列化对象。下面的SerializeDemo示例实例化Employee对象并将该对象序列化到文件中。
程序执行后,将创建一个名为employee.ser的文件。程序没有输出,但可以通过阅读代码来理解程序的功能。
注意:将对象序列化到文件时,Java标准惯例是为文件指定一个字符串.ser扩展名。
import java.io.*;
public class SerializeDemo
{
   public static void main(String [] args)
   {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      try
      {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}
三、反序列化对象
以下的 DeserializeDemo 程序实例了反序列化,/tmp/employee.ser 存储了 Employee 对象。
import java.io.*;
public class DeserializeDemo
{
   public static void main(String [] args)
   {
      Employee e = null;
      try
      {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      }catch(IOException i)
      {
         i.printStackTrace();
         return;
      }catch(ClassNotFoundException c)
      {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
    }
}
运行结果:
这里需要注意以下要点:
readObject()方法中的try/catch代码块尝试捕获ClassnotFoundException异常。对于要反序列化对象的JVM,它必须是能够找到字节码的类。如果JVM在对象反序列化期间找不到该类,则会引发ClassnotFoundException异常。
注意,readObject()方法的返回值被转化成Employee引用。
当对象被序列化时,属性SSN的值为111222333,但是因为该属性是短暂的,该值没有被发送到输出流,所以反序列化后 Employee 对象的SSN属性为 0。
以上就是关于大数据编程入门:Java序列化的全部内容了,希望这篇文章可以帮助到大家~
热点排行
推荐文章
立即申请>>