Java序列化将枚举读取为字符串
有一些用于二进制序列化的遗留Java POJO。在一个pojo的字段中,我有一个枚举字段。现在在新的JavaPOJO中,枚举字段被字符串字段替换Java序列化将枚举读取为字符串,java,serialization,enums,deserialization,Java,Serialization,Enums,Deserialization,有一些用于二进制序列化的遗留Java POJO。在一个pojo的字段中,我有一个枚举字段。现在在新的JavaPOJO中,枚举字段被字符串字段替换 // old pojo with enum class Test { private DataType dataType; private String someOtherField; } enum DataType { Int, Float, String } // new pojo without enu
// old pojo with enum
class Test {
private DataType dataType;
private String someOtherField;
}
enum DataType {
Int,
Float,
String
}
// new pojo without enum field
class NewTest {
private String dataType;
private String someOtherField;
}
在读取(反序列化)旧数据时,我使用了这里提到的技术——将旧数据读取到新的重构pojo中,该pojo成功地执行了非枚举字段。但将枚举数据读取到字符串字段几乎是不可能的。我也有例外
java.lang.ClassCastException:无法将demo.DataType实例分配给demo.NewTest实例中java.lang.String类型的demo.NewTest.DataType字段
我有没有办法做到这一点
编辑:
这是我的自定义ObjectInputStream
类MyObjectInputStream扩展了ObjectInputStream{
私有静态最终映射替换=migrationMap.get(oldName);
试一试{
resultClassDescriptor=ObjectStreamClass.lookup(替换);
}捕获(例外e){
log.error(“替换类名时出错。”+e.getMessage(),e);
}
}
}
返回resultClassDescriptor;
}
}
尝试将枚举更改为:
enum DataType {
Int,
Float,
String;
public static DataType getFromString(String stringDataType) {
for(DataType dataType in DataType.values()) {
if (dataType.toString().equals(stringDataType)) {
return dataType;
}
}
throw new IllegalArgumentException("Invalid input");
}
}
因此,当您要将枚举分配给您调用的字符串时:
newTest.dataType = test.dataType.toString();
test.dataType = DataType.getFromString(newTest.dataType);
当您想将字符串分配给Enum时,可以调用:
newTest.dataType = test.dataType.toString();
test.dataType = DataType.getFromString(newTest.dataType);
你能把你的课程打印出来吗?因为您引用的代码(来自答案)不会进行从一种类型(枚举)到另一种类型(字符串)的任何转换。我想您的问题在这里:
f.set(resultClassDescriptor,replacement)代码>其中replacement是数据类型,Java需要一个字符串。@NoDataFound用代码编辑了我的问题。总是有DataType.valueOf(String)用于这个问题,特别是在没有重写toString()的情况下。我想你是对的。我没有用编译器检查这个。除息的