我们都知道arraylist是自己实现了序列化方式,具体就是实现了WriteObject方法和ReadObject方法
javaprivate 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 的序列化和反序列化过程如下:
序列化:
defaultWriteObject()
方法,将 ArrayList 的非静态、非瞬时成员变量写入输出流。反序列化:
defaultReadObject()
方法,从输入流中读取 ArrayList 的非静态、非瞬时成员变量。下面是一个简单的示例代码:
javaimport 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 许可协议。转载请注明出处!