我有以下方法将文件(包含序列化对象)转换回对象:
public static <T, C extends Class<T>> T readSerializableObjectFromFile(final Path path, final C clazz) {
Objects.requireNonNull(path, "path");
Objects.requireNonNull(clazz, "clazz");
try (ObjectInputStream objectInputStream = new ObjectInputStream(Files.newInputStream(path))) {
return clazz.cast(objectInputStream.readObject());
} catch (IOException ex) {
throw new UncheckedIOException(ex);
} catch (ClassNotFoundException ex) {
throw new RuntimeException(ex);
}
}
假设我有一个 Organization
类型的对象,其中有 equals
和hashCode
方法,写在文件中,当我调用以下内容时会发生什么?
Organization organization =
readSerializableObjectFromFile(myFile, Organization.class);
是organization.hashCode()
使用Object#hashCode
或Organization#hashCode
实现?
当我存储 List<Organization>
时,行为会改变吗?在文件中,然后通过
@SuppressWarnings("unchecked")
List<Organization> organizations =
readSerializableObjectFromFile(myFile, List.class)
最佳答案
由于动态调度,每当您调用像 hashCode()
这样的方法或任何其他方法时,调用的特定函数取决于对象的运行时类型 (不是对象的声明类型)。 ObjectInputStream/ObjectOutputStream 将保留对象的运行时类型(运行时类是在序列化时编写的,因此用于在反序列化时实例化对象)。
您的转换操作只是检查结果的类型是否正确(这不是反序列化数据属于该类型的原因),并且不会导致数据被转换或截断(如果是这样的话)您所担心或担心的事情正在发生)。
对于 List
关于java - 序列化后使用 equals(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25138414/