我正在使用Java。我使用套接字建立连接,并使用ObjectOutputStream
. 可以发送两种类型的对象,一种是对象,它是A 类的实例,另一种是B 类的实例。当我在客户端读取 Object 时,如何确定它是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
)。
要么使用
if (object instanceof ClassA) {
或者
if (object.getClass() == ClassA.class) {
不同之处在于,当 object 是 ClassA 的子类或实现 ClassA (当它是接口时)时,第一个也是 true,而第二个只有当它恰好是那个类时才为 true。
是的,instanceof 运算符是最好的方法。
或者,使用纯文本形式的序列化并在序列化的有效负载中嵌入类型的名称(或者可能是反序列化策略)。这样,您可以在反序列化之前检查有效负载。