在 Java 中,要对 Set 类型进行序列化,可以使用以下方法:
java.util.Set
接口的子类,如 HashSet
或 LinkedHashSet
。这些类已经实现了 Serializable
接口,可以直接进行序列化。import java.io.*;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> mySet = new HashSet<>();
mySet.add("apple");
mySet.add("banana");
mySet.add("orange");
// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("mySet.ser"))) {
oos.writeObject(mySet);
System.out.println("Set 已序列化到 mySet.ser 文件");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Externalizable
接口。这样,你可以控制序列化和反序列化的具体实现。import java.io.*;
import java.util.HashSet;
import java.util.Set;
public class CustomSet implements Externalizable {
private Set<String> mySet;
public CustomSet() {
mySet = new HashSet<>();
}
public CustomSet(Set<String> mySet) {
this.mySet = mySet;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(mySet.size());
for (String item : mySet) {
out.writeUTF(item);
}
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
int size = in.readInt();
for (int i = 0; i < size; i++) {
mySet.add(in.readUTF());
}
}
public static void main(String[] args) {
Set<String> mySet = new HashSet<>();
mySet.add("apple");
mySet.add("banana");
mySet.add("orange");
// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("mySet.ser"))) {
oos.writeObject(new CustomSet(mySet));
System.out.println("Set 已序列化到 mySet.ser 文件");
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("mySet.ser"))) {
CustomSet deserializedSet = (CustomSet) ois.readObject();
System.out.println("Set 已反序列化");
System.out.println("Size: " + deserializedSet.mySet.size());
System.out.println("Elements: " + deserializedSet.mySet);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
这两种方法都可以实现 Set 类型的序列化。使用 Serializable
接口的方法更简单,而实现 Externalizable
接口的方法提供了更多的自定义选项。