有没有办法知道反序列化后哪种类型的java对象已被发送?

时间:2016-09-19 09:47:49

标签: java serialization udp deserialization

有一些方法可以序列化或反序列化java对象......

准备要发送的字节:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
try {
  out = new ObjectOutputStream(bos);   
  out.writeObject(yourObject);
  out.flush();
  byte[] yourBytes = bos.toByteArray();
  bos.close();
} 
catch(Exception ex)
{

}

从字节创建对象:

ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
ObjectInput in = null;
try 
{
    in = new ObjectInputStream(bis);
    Object o = in.readObject();
    if (in != null) 
    {
        in.close();
    } 


   } 
   catch (Exception ex) 
   {

   }

}

但是,如果有人想通过网络发送不同类型的对象,有办法知道哪种类型的对象已被发送。我想可以选择创建一个类,然后对其进行序列化和反序列化。

class SerialObject
{
   String type;
   Object object; 
}

3 个答案:

答案 0 :(得分:1)

当您进行序列化时,您可以将类型存储在某个位置 - 地图或缓存或某处,但仍不确定为什么要这样?

一种选择是在反序列化期间检查instanceof运算符。我不确定(为什么?)是否应该有更多?

Object deserialized = in.readObject();

if (deserialized instanceof TypeAbdClass) {
  // do something with ..
} else if (deserialized instanceof SomethingElse) {
  ...
} else if (...) {
  ...
}

答案 1 :(得分:1)

我认为了解发送对象类型的唯一方法是在java中使用InstanceOf关键字。 java instanceof运算符用于测试对象是否是指定类型(类或子类或接口)的实例。 java中的instanceof也称为类型比较运算符,因为它将实例与类型进行比较。它返回true或false。

class Demo{  
 public static void main(String args[]){  
 Demo s=new Demo();  
 System.out.println(s instanceof Demo);//true  
 }  
}  

此代码返回true。只需使用InstanceOf关键字。它将真正帮助

答案 2 :(得分:1)

您可以使用

Object.getClass() 

这将返回对象的运行时类

参考java doc https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html