1

我有两个简单的应用程序:客户端和服务器。客户端加密(简单 AES)自定义对象并通过 TCP 套接字将其作为字节发送到服务器。服务器解密这些字节并调用重新创建此对象的方法,如下所示:

private static Object getObjectFromBytes(byte[] credentials) throws IOException,      ClassNotFoundException{

    ByteArrayInputStream bis = new ByteArrayInputStream(credentials);
    ObjectInput in = null;
    Object credentialsObj = null;

    try {

        in = new ObjectInputStream(bis);
        credentialsObj = in.readObject(); 

    } finally {
      bis.close();
      in.close();
    }
    return credentialsObj;
}

在客户端,当我加密这个对象时,它的类型是mds.hm5.client.ITU_Credentials. 在服务器端,当我解密它并转换回对象时,它应该是mds.hm5.tokenservice.ITU_Credentials. 相反,我得到以下异常:

java.lang.ClassNotFoundException: mds.hm5.client.ITU_Credentials

他正在通过旧的类路径寻找这个对象。为什么会发生,我应该如何解决?

附加信息:

这是我在客户端将此对象转换为字节数组的方法:

private static byte[] getBytesFromObject(Object credentials) throws IOException{

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutput out = null;
    byte[] newBytes = null;

    try {

      out = new ObjectOutputStream(bos);   
      out.writeObject(credentials);
      newBytes = bos.toByteArray();

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
      out.close();
      bos.close();
    }
    return newBytes;
}   

我使用泛型类型的原因Object是因为我将使用这些方法来转换/加密/解密多种类型。这是正确的方法吗?

4

4 回答 4

3

在客户端,当我加密这个对象时,它的类型是 mds.hm5.client.ITU_Credentials。

这就是序列化流中的内容。

在服务器端,当我解密它并转换回对象时,它应该是 mds.hm5.tokenservice.ITU_Credentials。

不,不应该。它应该和你序列化它时一样[除非你已经采取了某些神奇的步骤,显然你没有。没有这些魔法步骤,就没有魔法,也没有任何联系mds.hm5.client.ITU_Credentials] mds.hm5.tokenservice.ITU_Credentials。您有两个具有相同名称和不同包的不同类,每个位置都有一个。他们不一样。

他正在通过旧的类路径寻找这个对象。

您对 CLASSPATH 和包名称感到困惑。他们不是一回事。它通过它的实际包名来寻找这个对象。它还能做什么?

于 2012-11-20T01:55:37.757 回答
2

对象输出流不会序列化类本身,而只会序列化其状态(字段值)。接收器需要它的类路径上的类文件。

也可以转班。您必须找到(或编写)一个可以从您的连接加载类的类加载器。如果你有你的类文件的 URL,那么你可以使用 URLClassloader。然后您不必将该类添加到您的类路径中。

于 2012-11-19T21:45:07.233 回答
0

您的客户端需要在其类路径中包含定义对象的 .class 文件。您正在做的是序列化/反序列化实例,而不是类。

于 2012-11-19T21:43:31.767 回答
0

迟了,但将来可能对某人有用:我想发送一个对象消息,其包是客户端的实体,但在服务器端,这个消息类没有嵌套在实体包中,所以抛出了这个异常. 这可能很愚蠢,但我花了很多时间来弄清楚这一点。

于 2020-04-28T00:37:06.187 回答