Java 确定序列化对象的类型

Java 确定序列化对象的类型,java,serialization,Java,Serialization,我需要通过套接字发送消息(从用户到引擎的请求,以及从引擎到用户的响应)。因此,流本质上是 +--------+ serialized request +--------+ | Server | <==== network ====> | Client | +--------+ serialized response +--------+ ^

我需要通过套接字发送消息(从用户到引擎的请求,以及从引擎到用户的响应)。因此,流本质上是

       +--------+ serialized  request +--------+      
       | Server | <==== network ====> | Client | 
       +--------+ serialized response +--------+      
           ^                              ^
           | request/response             | mouse/keyclicks
           |    object                    |
           v                              v
       +--------+                     +--------+
       | Engine |                     |  User  |
       +--------+                     +--------+
我没有关注的是,在我的服务器和客户端套接字中,我如何知道请求和响应的子类是什么?我看到这样的情况

Object request = in.readObject();

// now what? How do I know what to cast it to?

// Can I just cast it like
UserRequest request = (UserRequest)(in.readObject());
engine.addToRequestQueue(request); // let it take care of implementation details?

我的第一个想法是通过字符串传递所有内容,但当Java提供序列化时,这似乎有点愚蠢。但是我怎样才能确定我知道是哪门课碰到的?就此而言,我是否需要知道,只要我只向服务器发送UserRequest的死者,并向客户端发送EngineResponse?

只需使用提供的
instanceof
关键字:

Object o = in.readObject();

if (o instanceof SomeUserRequest)
{
  SomeUserRequest sur = (SomeUserRequest)o;
  ..
}
else if (o instanceof OtherUserRequest)
{
  ..
}

为了使您的协议能够使用简单的序列化,您需要让所有要发送的类在连接的两侧都可用

而您的
engineCallback()
方法将在服务器上执行,而不是对客户端的真正回调


如果您想要更多(比如在另一端调用方法,以及传递在另一端还不可用的类),那么您可能需要看看RMI(远程方法调用)。它基于协议的Java序列化,但添加了方法调用和将未知类传递到另一端以在那里执行的功能。

这样元数据就可以通过对象进行传输了吗?不仅仅是数据本身?@glowcoder:先生,您想阅读序列化规范以获得更深入的见解。;-)(是的,类元数据通过网络传输,因此接收方可以加载一个类并实例化一个新对象以将状态反序列化到其中。)@Jack或andersoj,我在那里的最后一段代码,
engine.addToRequestQueue(request)
-这是一种公认的做法吗?我不管你给我什么样的请求,我只想在我的引擎中使用它的回调方法?@glowcoder:是的,看起来不错。当我直接使用序列化时,我通常会安排一些事情,以便在反序列化对象之前知道对象的(超级)类型;其他任何东西都太挑剔了。但是是的,知道超类/接口类型并在上面进行调度是完全可以接受的。@glowcoder:没错!而且,为了让你的律师高兴,你应该防御性地为ClassCastException加入一个try/catch,以确保事情不会变得像探戈一样,并为律师提供充足的计费时间。
Object o = in.readObject();

if (o instanceof SomeUserRequest)
{
  SomeUserRequest sur = (SomeUserRequest)o;
  ..
}
else if (o instanceof OtherUserRequest)
{
  ..
}