Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java序列化将枚举读取为字符串_Java_Serialization_Enums_Deserialization - Fatal编程技术网

Java序列化将枚举读取为字符串

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

有一些用于二进制序列化的遗留Java POJO。在一个pojo的字段中,我有一个枚举字段。现在在新的JavaPOJO中,枚举字段被字符串字段替换

// 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()的情况下。我想你是对的。我没有用编译器检查这个。除息的