Java 如何知道套接字发送的对象类型?

Java 如何知道套接字发送的对象类型?,java,object,stream,Java,Object,Stream,我正在使用Java。我使用套接字建立连接,并使用ObjectOutputStream从服务器对象发送数据。可以发送两种类型的对象,一种类型是类A的实例对象,另一种类型是类B的实例对象。 当我在客户端读取对象时,如何确定它是类A的实例还是类B的实例 PS:我在客户端也可以访问这些类。简单的解决方案是在输入时使用instanceof运算符: final Object obj = inputStream.readObject(); if(obj instanceof A) { final A a

我正在使用Java。我使用套接字建立连接,并使用
ObjectOutputStream
从服务器对象发送数据。可以发送两种类型的对象,一种类型是类A的实例对象,另一种类型是类B的实例对象。 当我在客户端读取对象时,如何确定它是类A的实例还是类B的实例


PS:我在客户端也可以访问这些类。

简单的解决方案是在输入时使用
instanceof
运算符:

final Object obj = inputStream.readObject();
if(obj instanceof A) {
  final A a = (A)obj;
} else {
  final B a = (B)obj;
}

稍微冗余的解决方案(但避免
instanceof
)是首先发送一些类型字节(
0
-
A
1
-
B
)。

是的,instanceof运算符是最好的方法。

使用

if (object instanceof ClassA) {


区别在于,当对象是ClassA的子类或实现ClassA(当它是一个接口时)时,第一个也将为真,而第二个仅当它正是该类时才为真。

或者,使用纯文本形式的序列化&嵌入类型的名称(或者可能是反序列化策略)在串行有效载荷中。这样,你可以在反序列化之前检查有效负载。

但它是作为对象类型出现的,不是吗?是的,这就是你需要向下转换的原因。所有期末考试的目的是什么?@SteveKuo:使用函数式语言后,你的思维会转移到任何地方的不可变类型。没有真正的目的,但我可以随时使用它们,这会有什么帮助?这是同一个问题,发送了什么对象?对,是的。自我提醒:不要在醒来2分钟后回答问题。我改变了答案。
if (object.getClass() == ClassA.class) {