温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

EnumSet如何进行序列化操作

发布时间:2025-10-14 06:34:22 来源:亿速云 阅读:105 作者:小樊 栏目:编程语言

EnumSet 是 Java 中一个专门用于存储枚举类型元素的集合。它提供了高效的性能和紧凑的存储方式。然而,EnumSet 本身并不直接支持序列化,因为它没有实现 Serializable 接口。但是,你可以通过以下几种方法来实现 EnumSet 的序列化和反序列化:

方法一:使用 EnumSet.copyOf()

在序列化之前,你可以将 EnumSet 转换为一个不可变的 EnumSet,然后将其序列化。反序列化后,你可以使用 EnumSet.copyOf() 方法将其转换回原始的 EnumSet

import java.io.*;
import java.util.EnumSet;

public class EnumSetSerializationExample {

    public enum Color {
        RED, GREEN, BLUE
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        EnumSet<Color> enumSet = EnumSet.of(Color.RED, Color.BLUE);

        // 序列化
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(EnumSet.copyOf(enumSet));
        objectOutputStream.close();

        // 反序列化
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        EnumSet<Color> deserializedEnumSet = (EnumSet<Color>) objectInputStream.readObject();
        objectInputStream.close();

        System.out.println("Original EnumSet: " + enumSet);
        System.out.println("Deserialized EnumSet: " + deserializedEnumSet);
    }
}

方法二:自定义序列化和反序列化方法

你可以为 EnumSet 创建一个自定义的序列化和反序列化方法。这通常涉及到将 EnumSet 转换为一个数组或集合,然后将其序列化为基本数据类型或字符串。

import java.io.*;
import java.util.EnumSet;

public class EnumSetSerializationExample {

    public enum Color {
        RED, GREEN, BLUE
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        EnumSet<Color> enumSet = EnumSet.of(Color.RED, Color.BLUE);

        // 序列化
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);
        serializeEnumSet(dataOutputStream, enumSet);
        dataOutputStream.close();

        // 反序列化
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        DataInputStream dataInputStream = new DataInputStream(byteArrayInputStream);
        EnumSet<Color> deserializedEnumSet = deserializeEnumSet(dataInputStream);
        dataInputStream.close();

        System.out.println("Original EnumSet: " + enumSet);
        System.out.println("Deserialized EnumSet: " + deserializedEnumSet);
    }

    private static void serializeEnumSet(DataOutputStream dataOutputStream, EnumSet<?> enumSet) throws IOException {
        dataOutputStream.writeInt(enumSet.size());
        for (Object element : enumSet) {
            dataOutputStream.writeUTF(element.toString());
        }
    }

    private static EnumSet<?> deserializeEnumSet(DataInputStream dataInputStream) throws IOException {
        int size = dataInputStream.readInt();
        EnumSet<?> enumSet = EnumSet.noneOf((Class<? extends Enum<?>>) ((Enum<?>) dataInputStream.readUTF()).getDeclaringClass());
        for (int i = 0; i < size; i++) {
            enumSet.add((Enum<?>) dataInputStream.readUTF());
        }
        return enumSet;
    }
}

方法三:使用第三方库

有一些第三方库提供了对 EnumSet 的序列化支持,例如 Jackson 和 Gson。这些库通常提供了更灵活和强大的序列化功能。

使用 Jackson

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.io.IOException;
import java.util.EnumSet;

public class EnumSetSerializationExample {

    public enum Color {
        RED, GREEN, BLUE
    }

    public static void main(String[] args) throws IOException {
        EnumSet<Color> enumSet = EnumSet.of(Color.RED, Color.BLUE);

        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(EnumSet.class, new EnumSetSerializer());
        objectMapper.registerModule(simpleModule);

        // 序列化
        String jsonString = objectMapper.writeValueAsString(enumSet);
        System.out.println("Serialized JSON: " + jsonString);

        // 反序列化
        EnumSet<Color> deserializedEnumSet = objectMapper.readValue(jsonString, EnumSet.class);
        System.out.println("Deserialized EnumSet: " + deserializedEnumSet);
    }

    static class EnumSetSerializer extends JsonSerializer<EnumSet<?>> {
        @Override
        public void serialize(EnumSet<?> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeStartArray();
            for (Object element : value) {
                gen.writeString(element.toString());
            }
            gen.writeEndArray();
        }
    }
}

通过这些方法,你可以实现 EnumSet 的序列化和反序列化操作。选择哪种方法取决于你的具体需求和偏好。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI