0

信令协议经常使用具有明确定义的整数值的枚举类型。例如

public enum IpHdrProtocol {

TCP(6),
SCTP(132),
MPLS(137);
int Value;

IpProtocol(int value) {
    Value = value;
}

我试图找到一种仅使用枚举类类型和实例的整数值将此类值反序列化为其相应枚举类型的方法。

如果这需要将静态 getEnumFromInt(int) 函数添加到每个枚举,那么如何定义这个“接口”,以便枚举作者可以确保他们的枚举可以序列化。

怎样才能最好地做到这一点?

4

3 回答 3

1

不确定你想走多远,但这里有一些非常丑陋的代码,对你的枚举的侵入性较小:

public class Main {

    public enum IpHdrProtocol {

        TCP(6), SCTP(132), MPLS(137);
        int Value;

        IpHdrProtocol(int value) {
            Value = value;
        }
    }

    public static void main(String[] argv) throws NoSuchMethodException, IllegalArgumentException, InvocationTargetException,
            IllegalAccessException, SecurityException, NoSuchFieldException {
        System.err.println(getProtocol(6));
        System.err.println(getProtocol(132));
        System.err.println(getProtocol(137));
    }

    private static IpHdrProtocol getProtocol(int i) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException,
            SecurityException, NoSuchFieldException {
        Field f = IpHdrProtocol.class.getDeclaredField("Value");
        Method m = IpHdrProtocol.class.getMethod("values", null);
        Object[] invoke = (Object[]) m.invoke(null, null);
        for (Object o : invoke) {
            if (!f.isAccessible()) {
                f.setAccessible(true);
            }
            if (((Integer) f.get(o)).intValue() == i) {
                return (IpHdrProtocol) o;
            }
        }
        return null;
    }

    }
于 2012-03-07T12:19:27.283 回答
1

如果你在谈论 Java 的内置序列化,Enums 已经实现了 Serializable 接口。只需序列化枚举值,就完成了。

如果你想构建自己的序列化,你可以只读取和写入 int 值,并在反序列化时通过将其添加到枚举中来获取相应的枚举值:

public static IpHdrProtocol valueOf(int value) {
  for (IpHdrProtocol p : values()) {
    if (p.Value == value) return p;
  }
  return null; // or throw exception
}
于 2012-03-07T12:25:37.127 回答
0

首先,您的代码无法编译。解决方案如下(如果这是您想要的):

 public enum IpHdrProtocol {

    TCP(6),
    SCTP(132),
    MPLS(137);
    int Value;

    IpHdrProtocol(int value) {
        Value = value;
    }

    public static IpHdrProtocol getFromInt(int val) {
        for(IpHdrProtocol prot : values()) {
            if(prot.Value == val) {
                return prot;
            }
        }

        return null;
    }
}
于 2012-03-07T12:24:50.950 回答