Java序列化示例

时间:2020-02-23 14:37:15  来源:igfitidea点击:

序列化对象。那是什么意思?Java提供了一种将对象表示为字节序列的功能,其中包括对象的数据,以及对象类型和存储在该对象中的数据类型的信息。

当一个序列化的对象被写入一个文件后,它可以被反序列化,这意味着另一种方式-类型信息和代表对象及其数据的字节可以用来在内存中重新创建对象。

创建的字节流与平台无关。这意味着,如果一个对象在一个平台上序列化,那么它可以在另一个平台上反序列化。

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

ObjectInputStream提供一个名为readObject()的方法,该方法检索一个对象并将其反序列化。它返回一个对象值,这意味着需要将其强制转换为适当的数据类型。它引发IOException。

public final Object readObject()

ObjectOutputStream提供了很多写方法,但最广泛使用的是

public final void writeObject(Object object)

*writeObject()*方法序列化对象并将其发送到输出流。如果序列化出错,它可能会抛出IOException。

因此,为了直观地显示这些方法的确切位置,让我们在上面的图像上显示它们。

Java序列化示例

演示对象.java

import java.io.*; 

public class DemoObject implements java.io.Serializable { 
  private String name; 
  private int age;

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

  public String getName() {
      return this.name;
  }

  public int getAge() {
      return this.age;
  }
}

主类

import java.io.*;  

public class Main { 
  public static void main(String[] args) {    
      DemoObject objectExample = new DemoObject("John", 19); 
      String filename = "file.ser"; 
      DemoObject obj = null; 

      //serialization  
      try {    
          FileOutputStream file = new FileOutputStream(filename); 
          ObjectOutputStream output = new ObjectOutputStream(file); 

          output.writeObject(objectExample);    
          output.close(); 

          file.close(); 

          System.out.println("Serialization of object has been completed"); 
        } 

      catch(IOException err) { 
          System.out.println("IOException occurred"); 
      } 

      //Deserialization 
      try {    
          FileInputStream file = new FileInputStream(filename); 
          ObjectInputStream input = new ObjectInputStream(file); 

          obj = (DemoObject) input.readObject(); //cast to the appropriate type

          input.close(); 
          file.close(); 

          System.out.println("Deserialization of object has been completed"); 
          System.out.println();
          System.out.println("Values of deserialized object are:");
          System.out.println("==================================");
          System.out.println("Name = " + obj.getName()); 
          System.out.println("Age  = " + obj.getAge()); 
          System.out.println("==================================");
      } 
      catch(IOException err)  { 
          System.out.println("IOException is caught"); 
      } 

      catch(ClassNotFoundException err) { 
          System.out.println("ClassNotFoundException is caught"); 
      } 

  } 
}

输出

Serialization of object has been completed
Deserialization of object has been completed

Values of deserialized object are:
==================================
Name = John
Age  = 19
==================================

上述代码实现分解

我们有一个DemoObject类,充当一个伪类,我们将对其进行序列化,然后反序列化。它有两个实例变量,我们称之为name和age。我们可以将这些变量公开,但是我们希望始终是安全的,所以在上面的示例中,它们被声明为私有的。

主.java强制转换writeObject和readObject,基本上是将错误处理和打印到控制台。在这个例子中,我们有一个对象被设置为null。它被设置为null,因为它充当反序列化对象的“占位符”。基本上,我们可以将期望对象复制到空对象中。

注意:如果编辑显示此警告:

我们可以忽略它或者将IDE配置为自动生成id。我始终建议让IDE为我们创建唯一标识符。

何时需要序列化

序列化是在组件之间传输对象的通用且高效的协议。序列化用于传输遵循此协议的对象。

最后一点:请始终记住,用一个版本的Java序列化的对象可能无法在另一个版本的Java上运行。例如:用Java6序列化对象,用Java8反序列化对象,反之亦然。