亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

序列化后Instanceof為同一個類返回false

序列化后Instanceof為同一個類返回false

回首憶惘然 2021-12-22 16:00:21
在 org.springframework.security.oauth2.common.util.SerializationUtils 在 Spring 啟動應用程序中進行 fastxml 反序列化后,Instanceof 為同一類返回 falsenew ObjectMapper().readValue(serialized, User.class);班級public class User implements Serializable {//...}因為新對象 getClass().getClassloader() 返回不同的類加載器,如何解決這個和轉換問題?
查看完整描述

1 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

在這種情況下,您應該比較類名而不是使用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);

}


查看完整回答
反對 回復 2021-12-22
  • 1 回答
  • 0 關注
  • 365 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號