1

私はサーバーからクラスを逆シリアル化しようとしますが、クライアントでは次のようになります:

java.lang.ClassNotFoundException: com.server.core.StateFilesStruct

私のクライアントでは、このパッケージ名の StateFilesStruct クラスは次のとおりです。

com.client.core.StateFilesStruct

ここに私のクラスがあります:

public  Object deserialize(byte[] bytes)   {
        ByteArrayInputStream b = new ByteArrayInputStream(bytes);
        ObjectInputStream o = null;
        try {
            o = new ObjectInputStream(b);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            return o.readObject();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return o;
}

これを送信するクラスはサーバーにあります:

package com.server.core;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Hashtable;

 public class StateFilesStruct implements Serializable {
    private static final long serialVersionUID = 988633010151085730L;
    private Hashtable<String,String> Repository;
    public Hashtable<String, String> getRepository() {
        return Repository;
    }
    public void setRepository(Hashtable<String, String> repository) {
        Repository = repository;
    }
    public StateFilesStruct()
    {
        Repository = new Hashtable<String,String>();
    }
}

クライアントに保持するクラスはサーバーと同じですが、パッケージ名が異なります。

package com.client.core;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Hashtable;

 public class StateFilesStruct implements Serializable {
    private static final long serialVersionUID = 988633010151085730L;
    private Hashtable<String,String> Repository;
    public Hashtable<String, String> getRepository() {
        return Repository;
    }
    public void setRepository(Hashtable<String, String> repository) {
        Repository = repository;
    }
    public StateFilesStruct()
    {
        Repository = new Hashtable<String,String>();
    }
}

クライアントでクラスを解決しようとする方法は次のとおりです。ZeroMQを使用してtcpipソケットから受信する

 byte[] byteFileStruct = m_pNetworkManager.getSocket().recv(0); 
 StateFilesStruct stateFilesStruct = (StateFilesStruct)deserialize(byteFileStruct);

サーバークラスから見えるように、この例外を取得します。

java.lang.ClassNotFoundException: com.server.core.StateFilesStruct
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
4

1 に答える 1

3

Javaでは、パッケージ名はクラス名の一部です。JVMに関する限り、これらは2つの完全に異なるクラスであるため、クラスパスで逆シリアル化するのと同じクラスを使用する必要があります。

于 2013-01-29T19:56:05.777 に答える