簡體   English   中英

通過套接字發送匿名類? (Java中的Object..Stream)

[英]Send an Anonymous class over sockets? (Object..Stream in Java)

所以現在,我有一個使用ObjectInputStreamObjectOutputStream運行的服務器。

我遇到的問題是我有一個自定義(匿名)類,它擴展了我試圖發送給客戶端然后編譯的java.lang.Date

所以我沒有在客戶端定義類,但我想以編程方式編譯類。 我嘗試了很多不同的方法,但每次我得到一個ClassNotFoundException因為該類最初不在客戶端。

Class<?> dateClass = (Class<?>) in.readObject(); //This is where the CNF Exception occurs
Compiler.compileClass(dateClass);

Java Serialization機制假定反序列化JVM已知類,它不發送類定義。 特別是,在序列化Class對象時,不要發送該類的字節代碼,而只是指示接收VM查找具有特定名稱的類的Class對象。

另請注意, Class對象表示在JVM中定義的類,即類的字節碼已經加載。 加載類之后嘗試編譯到類以生成該字節碼是沒有意義的。

因此,我們需要以某種方式將類定義提供給客戶端。 最簡單的方法是像客戶端需要的任何其他類一樣(通過將其打包在客戶端的jar文件中,或者用於安裝客戶端程序的任何方法)。 如果這不可能,您可以通過網絡加載類定義,例如使用URLClassLoader ,或者您可以通過序列化流發送類文件,並在客戶端接收它時使用ClassLoader.defineClass加載類。

PS:這個問題完全獨立於該類是否被命名。 以下測試代碼顯示匿名類的對象可以很好地序列化和反序列化(如果接收VM具有類定義):

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
        Serializable payload = new Serializable() {
            @Override
            public String toString() {
                return "hello from the anonymous class";
            }
        };
        oos.writeObject(payload);
        oos.writeObject(payload.getClass());
    }

    try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
        System.out.println(in.readObject());
        System.out.println(in.readObject());
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM