专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java修炼终极指南:124 将对象序列化为字节数组

temp10 2024-10-11 18:27:04 java教程 18 ℃ 0 评论

在第4章,问题X中,我们讨论了Java记录的序列化/反序列化,所以您应该对这些操作非常熟悉。简而言之,序列化是将内存中的对象转换为字节流的过程,这些字节流也可以存储在内存中或写入文件、网络、数据库、外部存储等。反序列化是从给定的字节流中重新创建内存中对象状态的反向过程。如果一个Java对象的类实现了java.io.Serializable(或java.io.Externalizable),则该对象是可序列化的。通过java.io.ObjectOutputStream和java.io.ObjectInputStream类以及writeObject()/readObject()方法完成序列化/反序列化。 例如,假设有以下Melon类:


Java修炼终极指南:124 将对象序列化为字节数组

public class Melon implements Serializable {
  private final String type;
  private final float weight;
  // 构造函数,getter,setter
}

以及一个Melon的实例:

Melon melon = new Melon("Gac", 2500);

将melon实例序列化为字节数组可以按照以下方式完成:

public static byte[] objectToBytes(Serializable obj)
       throws IOException {
 ByteArrayOutputStream baos = new ByteArrayOutputStream();
       
 try (ObjectOutputStream ois = new ObjectOutputStream(baos)) {
  ois.writeObject(obj);
 }
       
 baos.close();
 return baos.toByteArray();
}

当然,我们可以使用这个助手来序列化任何其他对象,但对于melon实例,我们这样调用它:

byte[] melonSer = Converters.objectToBytes(melon);       

反序列化是通过另一个使用readObject()的助手完成的,如下所示:

public static Object bytesToObject(byte[] bytes)
       throws IOException, ClassNotFoundException {
               
 try ( InputStream is = new ByteArrayInputStream(bytes);
  ObjectInputStream ois = new ObjectInputStream(is)) {
   return ois.readObject();
 }
}

我们可以使用这个助手将任何其他对象从字节数组中反序列化,但对于melonSer,我们这样调用它:

Melon melonDeser = (Melon) Converters.bytesToObject(melonSer);       

返回的melonDeser恢复了初始对象状态,即使它不是同一个实例。在打包的代码中,您还可以看到一种基于Apache Commons Lang的方法。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表