【问题标题】:Instanceof returns false for same class after serialization序列化后,Instanceof 对同一类返回 false
【发布时间】:2019-04-05 03:53:18
【问题描述】:

在 Spring 启动应用程序中 org.springframework.security.oauth2.common.util.SerializationUtils fasterxml 反序列化后,Instanceof 对同一类返回 false

new ObjectMapper().readValue(serialized, User.class);

public class User implements Serializable {//...
}

由于新对象getClass().getClassloader()返回不同的类加载器,如何解决这个和casting问题?

【问题讨论】:

  • 我曾经遇到过同样的问题。它与弹簧开发工具有关。一旦我摆脱了这种依赖,一切都按预期工作。如果您有该依赖项,请尝试删除或检查是否存在导致此问题的任何依赖项。
  • 正如阿兰所说,删除下面的依赖对我有用。 org.springframework.bootspring-boot-devtools

标签: java spring class serialization classloader


【解决方案1】:

在这种情况下,您应该比较类名而不是使用instanceof。即使类是由不同的类加载器加载的,规范名称也是相同的:

public boolean haveSameCanonicalName(Object object, Class<?> clazz) {
     String actualClassName = object.getClass().getCanonicalName();
     String expectedClassName = clazz.getCanonicalName();
     return actualClassName.equals(expectedClassName);
}

然后你可以像这样使用它:

if (haveSameCanonicalName(user, User.class)) {
    // Do something here
}

更新:

如果您仍然需要投射对象,有一个解决方法:

 public class CrossCastUtils {

    private final ObjectOutputStream oos;
    private final ObjectInputStream ois;

    public CrossCastUtils() throws IOException {
        final PipedOutputStream pos = new PipedOutputStream();
        final PipedInputStream pis = new PipedInputStream(pos);
        oos = new ObjectOutputStream(pos);
        ois = new ObjectInputStream(pis);
    }

    public <T> T cast(Object object) throws IOException, ClassNotFoundException {
        oos.writeObject(object);
        oos.flush();
        return (T) ois.readObject();
    }

尝试运行这个测试:

@Test
public void testCrossCast(){
    Object initial = ... // retrieve it as you did before
    User result = CrossCastUtils.cast(initial);

    assertFalse(initial instanceof User);
    assertTrue(result instanceof User);
}

【讨论】:

  • @ArthurDn 我更新了我的答案(添加了交叉转换解决方法)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多