gpt4 book ai didi

java - 序列化后使用 equals()

转载 作者:行者123 更新时间:2023-12-01 22:47:21 24 4
gpt4 key购买 nike

我有以下方法将文件(包含序列化对象)转换回对象:

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 类型的对象,其中有 equalshashCode方法,写在文件中,当我调用以下内容时会发生什么?

Organization organization = 
readSerializableObjectFromFile(myFile, Organization.class);

organization.hashCode()使用Object#hashCodeOrganization#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com