java中的反序列化,在google应用程序引擎中

java中的反序列化,在google应用程序引擎中,java,android,google-app-engine,serialization,deserialization,Java,Android,Google App Engine,Serialization,Deserialization,我在Java和Google应用程序引擎中遇到了反序列化问题。 我想发送一个序列化的my_类对象。虽然发送端没有报告错误,但接收端在此代码上抛出ClassNotFoundException: my_class obj = (my_class) out.readObject(); 在服务器代码中 异常消息以类似路径的形式显示客户端my_类名。我还在appengine的后端模块中复制了我的_类文件,但仍然出现了这个错误。Google指出了类似类加载的问题,但我不太明白这是什么,也不知道如何解决 我在

我在Java和Google应用程序引擎中遇到了反序列化问题。 我想发送一个序列化的my_类对象。虽然发送端没有报告错误,但接收端在此代码上抛出ClassNotFoundException:

my_class obj = (my_class) out.readObject();
在服务器代码中

异常消息以类似路径的形式显示客户端my_类名。我还在appengine的后端模块中复制了我的_类文件,但仍然出现了这个错误。Google指出了类似类加载的问题,但我不太明白这是什么,也不知道如何解决

我在android studio中的代码 客户端

URL url = new URL(urln);
s1=s1+" two";
con=(HttpURLConnection)url.openConnection();
con.setRequestMethod("POST");
con.setDoInput(true);
con.setDoOutput(true);
ObjectOutputStream oos=new ObjectOutputStream(new BufferedOutputStream(con.getOutputStream()));
oos.reset();
oos.writeObject(objectofserializable_my_class);
oos.flush();
oos.close();
DataInputStream dis=new DataInputStream(new BufferedInputStream(con.getInputStream()));
s3=dis.readLine();
这是工作正常,我得到http响应,即,e.getMessage确切的com.package.my_类,但我复制了后端模块中的确切的my_类.java文件,google appengine,但在接收方使用不同的包语句

servlet appengine上的服务器端代码

public class ServerSide extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(req.getInputStream()));
my_class obj=(my_class)ois.readObject();
String s1=obj.getName();
s=" i got it ";
resp.setContentType("text/plain");
resp.getWriter().println(s);
} catch (ClassNotFoundException e) {
resp.getWriter().print(e.getMessage());
} catch(IOException e){
resp.getWriter().print(e.getMessage());
}
}
}

抱歉,我无法获取printstacktrace,因为它正在Google App engine中运行……

要通过序列化/反序列化成功传输对象,通信双方必须能够加载所传输对象类的兼容版本,通过序列化对象访问的任何对象的类也会被传输。加载这些类通常也需要加载其他类。如果另一个对象在成员变量中直接或间接地持有对该对象的引用,则该对象可以通过另一个对象访问

您提供的源代码行引用了类my_类,因此,如果源代码中包含该行的任何类本身都不能在没有加载某些版本的类my_类的情况下加载。由于您已将异常归因于特定的行,因此我假设接收程序实际运行并因此首次成功加载,并且异常的堆栈跟踪标识了您显示的行

在这种情况下,程序不会抛出与类my_类相关的ClassNotFoundException,因为它必须不仅找到该类,而且已经加载了该类。我可以相信一个InvalidClassException,它可能是由于两个不同的原因引起的。但是,如果异常实际上是ClassNotFoundException,那么它必须属于不同的类。如果my_类声明了任何嵌套类,那么其中一个可能就是找不到的类,这就是为什么您应该始终在问题中包含完整的异常消息和堆栈跟踪的原因之一。此类类的JVM格式名称类似于me/mypackage/my_class$Nested


通过将所需的类文件放在接收程序的类路径中来修复此类异常。

哦,天啊,我终于找到了它。my_类文件的package语句在发送方和接收方不同,因此错误ClassNotFoundException。不知何故,在发送方和接收方的我的_类java文件中管理了相同的包语句之后,这就有了明确的出路。。。。。。。。。
i、 例如,serializable类的确切版本应该同时出现在发送方和接收方…

一般来说,如果您想在这里询问有关程序引发的Java异常的问题,您应该提供实际的堆栈跟踪,包括确切的异常消息。剪切并粘贴,或将其捕获到文件中。使用标准命名约定。特别是,类名应该以大写字母开头,并使用大小写,而不是下划线。当然,thanx@John Bollingeri在接收方也有我的类java文件的精确副本,但不同的包语句与发送方不同@John还请告诉我如何在类路径中添加类文件如果它在不同的包中,那就完全不同了。即使其他一切都是一样的。