java - 序列化后使用 equals()

标签 java serialization equals

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

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/

相关文章:

java - 获取第一个解锁行

java - 简单框架 XML 反序列化 ValueRequiredException

java - 具有延迟加载业务标识符的 Hibernate/JPA equals() 和 hashCode()

java - 有什么可以警告我不要使用 type.equals(incompatibleType) 吗?

java - 在 SmartGWT 的根节点上禁用 Drop

java - 异常描述: xxx uses a non-entity xx as target entity in the relationship attribute [method xxx]

java - 如何将 JsonNode 映射到对象的 ArrayList

java - 使用键作为字符串序列化和反序列化映射

c# - Thrift/Proto 如何做?

hibernate - 在 JPA2/Hibernate 中使用覆盖的 equals/hashCode 审计 @Embeddables 的集合