亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

Java - 序列化

Java 提供了一种机制,称为对象序列化,其中对象可以表示为字节序列,其中包括对象的数据以及有关对象类型和对象中存储的数据类型的信息。

序列化的对象写入文件后,可以从文件中读取并进行反序列化,即代表对象及其数据的类型信息和字节可用于在内存中重新创建对象。

最令人印象深刻的是整个过程是独立于 JVM 的,这意味着一个对象可以在一个平台上序列化并在完全不同的平台上反序列化。

ObjectInputStreamObjectOutputStream 是包含序列化和反序列化对象方法的高级流。

ObjectOutputStream 类包含许多用于写入各种数据类型的写入方法,但其中一种方法尤为突出 -

public final void writeObject(Object x) throws IOException

上面的方法序列化一个 Object 并将其发送到输出流。同样,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 标准类是否可序列化,请查看该类的文档。测试很简单:如果类实现了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 程序反序列化在 SerializeDemo 程序中创建的 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);
   }
}

这将产生以下结果 -

输出

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

以下是需要注意的要点 -


java

  1. Java final 关键字
  2. Java instanceof 运算符
  3. Java 继承
  4. Java 嵌套静态类
  5. Java 匿名类
  6. Java 单例类
  7. Java 反射
  8. Java ArrayList 类
  9. Java ObjectOutputStream 类
  10. Java 泛型
  11. Java 文件类
  12. Java - 对象和类