我想将java枚举序列化/反序列化为int。我正在使用Android Wear可穿戴数据层API在Wear和Phone设备之间传输枚举设置。这意味着我需要将我的枚举转换为int并以编程方式返回枚举。请注意,我不需要创建新的枚举,只匹配现有的枚举。我担心的是,尽管我可以使用枚举方法轻松设置值,但似乎我可以轻松设置不存在的值。
public enum Color {
Undefined (0), Red(1), Yellow(2), Blue(3), Green(4), Black(5);
private int mValue;
private Color(int value) { this.mValue = value;} // Constructor
public int id(){return mValue;} // Return enum index
public void setValue(int i){mValue = i;}; // Set index
}
因此,我可以做到以下几点:
Color color = Color.Red;
int index = color.id();
putDataMapReq.getDataMap().putInt("color",index);
这个值可以作为int传输,我想重新构建如下,但我不能让setValue()方法可以访问:
int newindex = dataMap.getInt ("color");
Color newColor = Color.Undefined;
newColor.setValue(newIndex);
这是正确的方法吗?有没有办法验证新索引值是否合法?
答案 0 :(得分:8)
为了简单起见,我建议您使用emen的方法name
和valueof
。
您的Color
将是这样的:
public enum Color {
Undefined , Red, Yellow, Blue, Green, Black;
}
序列化:
Color color = Color.Red;
String name = color.name();
反序列化:
String newName = dataMap.getString("color");
Color newColor = Color.valueOf(newName);
<强>更新强>
如果你想使用整数,你的代码将如下所示:
public enum Color {
Undefined (0), Red(1), Yellow(2), Blue(3), Green(4), Black(5);
private int mValue;
Color(int value) { this.mValue = value;} // Constructor
public int id(){return mValue;} // Return enum index
public static Color fromId(int value) {
for(Color color : values()) {
if (color.mValue == value) {
return color;
}
}
return Undefined;
}
}
序列化:
Color color = Color.Red;
int index = color.id();
反序列化:
int newIndex = dataMap.getInt("color");
Color newColor = Color.fromId(newIndex);
答案 1 :(得分:1)
首先,我强烈建议您的枚举不变,以防止用户感到惊讶。 Java 1.5 documentation中所述的枚举的原始用法是替换常量列表。
至于传输数据,Android可穿戴docs on data syncing建议尽可能使用DataMap:
如果可能,请使用DataMap类。这种方法允许您以Android Bundle的形式处理数据项,因此系统会为您执行对象序列化和反序列化,并且您可以使用键值对操作数据。
虽然我没有使用可穿戴设备的经验,但Android有自己的Bundle
和Parcelable
序列化机制,而且有Parceler这样的项目可以帮助生成序列化代码您。您可以使用#fromBundle(...)将包转换为数据地图。
如果你使用Parceler路由,你可以依靠内置的枚举序列化或编写任意代码。通过查看available values匹配(或者如果非常大的话,在预先计算的映射中查找它们),从一些规范值创建enum
实例是一种常见的Java模式:
public enum Foo {
VAL_1("bar");
private final String strval;
Foo(final String strval) { this.strval = strval; }
public static Foo fromStrval(final String strval) {
for (final Foo f : Foo.values()) {
if (f.strval.equals(strval)) return f;
}
return null;
}
}