编辑
2024-04-16
Java
00
请注意,本文编写于 389 天前,最后修改于 389 天前,其中某些信息可能已经过时。

我们都知道arraylist是自己实现了序列化方式,具体就是实现了WriteObject方法和ReadObject方法

java
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // Write out element count, and any hidden stuff int expectedModCount = modCount; s.defaultWriteObject(); // Write out size as int, followed by all elements in the proper order. s.writeInt(size); for(int i=0; i<size; i++) { s.writeObject(elementData[i]); } if (modCount != expectedModCount) { throw new ConcurrentModificationException(); } } private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { elementData = EMPTY_ELEMENTDATA; // Read in size, and any hidden stuff s.defaultReadObject(); // Read in array length and allocate array s.readInt(); // ignored int arrayLength = calculateCapacity(elementData, size); SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, arrayLength); if (arrayLength != 0) { ensureCapacityInternal(arrayLength); } // Read in all elements in the proper order. for (int i=0; i<size; i++) { elementData[i] = s.readObject(); } }

从上面的代码可以看出,ArrayList 的序列化和反序列化过程如下:

  1. 序列化:

    • 首先调用 defaultWriteObject() 方法,将 ArrayList 的非静态、非瞬时成员变量写入输出流。
    • 然后写入 ArrayList 的 size 值。
    • 最后逐个将 ArrayList 中的元素写入输出流。
  2. 反序列化:

    • 首先调用 defaultReadObject() 方法,从输入流中读取 ArrayList 的非静态、非瞬时成员变量。
    • 然后从输入流中读取 ArrayList 的 size 值。
    • 根据 size 值,创建一个新的 Object 数组并分配内存空间。
    • 最后逐个从输入流中读取元素,并存储到新创建的数组中。

下面是一个简单的示例代码:

java
import java.io.*; import java.util.ArrayList; public class ArrayListSerializationExample { public static void main(String[] args) { // 创建一个 ArrayList ArrayList<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("cherry"); // 序列化 ArrayList try (FileOutputStream fos = new FileOutputStream("list.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(list); } catch (IOException e) { e.printStackTrace(); } // 反序列化 ArrayList ArrayList<String> deserializedList; try (FileInputStream fis = new FileInputStream("list.ser"); ObjectInputStream ois = new ObjectInputStream(fis)) { deserializedList = (ArrayList<String>) ois.readObject(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); return; } // 打印反序列化后的 ArrayList System.out.println(deserializedList); } }

在这个示例中,我们创建了一个 ArrayList,并将其序列化到文件中。然后从文件中读取并反序列化回一个新的 ArrayList 对象,最后打印出来。整个过程展示了 ArrayList 的序列化和反序列化实现。

同样还有HashMap还有HashSet也实现了自己的序列和方法

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!