Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法知道Android上包裹中的对象是什么类型的?_Java_Android_Networking_Serialization_Parcelable - Fatal编程技术网

Java 有没有办法知道Android上包裹中的对象是什么类型的?

Java 有没有办法知道Android上包裹中的对象是什么类型的?,java,android,networking,serialization,parcelable,Java,Android,Networking,Serialization,Parcelable,我正在制作一个Android应用程序,它通过网络以字节数组的形式发送两种类型的对象,这两种对象实现了可包裹接口(让我们称它们为objectA和objectB)。但在接收端,我需要知道包裹中到达的是哪种类型的物品。readValue()方法只返回Object,因此在接收端我不知道应该重新创建objectA或objectB哪个对象。如何做到这一点?地块中是否有描述原始对象类型的元数据 编辑:语言是Java 编辑:添加了示例代码 ObjectA objA=新的ObjectA(“uid”,“descri

我正在制作一个Android应用程序,它通过网络以字节数组的形式发送两种类型的对象,这两种对象实现了可包裹接口(让我们称它们为objectA和objectB)。但在接收端,我需要知道包裹中到达的是哪种类型的物品。readValue()方法只返回Object,因此在接收端我不知道应该重新创建objectA或objectB哪个对象。如何做到这一点?地块中是否有描述原始对象类型的元数据

编辑:语言是Java

编辑:添加了示例代码

ObjectA objA=新的ObjectA(“uid”,“description”);
字节[]字节=parceletil.toBytes(objA)//这模拟了发送
重建的对象=Parceletil.rebuildFromBytes(字节)//这里我不知道我在重建什么,objectA还是objectB
if(地块的重建实例){
地块p=(地块)重建;
ObjectB oB=(ObjectB)p.readValue(ObjectB.class.getClassLoader());
if(oB.getUid()==null){
ObjectA oA=(ObjectA)p.readValue(ObjectA.class.getClassLoader());//这也将充满空值
}
}

我想您可以访问可能是您收到的对象类型的类。在Java中,您只需使用instanceof运算符检查您接收到的对象:

if (yourObject instanceof YourClass) {
  // Your code here
}
对于地块,有一个readValue方法可接受类加载器,请使用类加载器调用此方法,它应该可以工作,例如:

Point pointFromParcel = (Point) parcel.readValue(Point.class.getClassLoader());


如果您不知道包装器类将是什么对象,您可以创建一个包装器类,其中包含ObjectA或ObjectB以及一个字段,以指示包装器当前包含的对象。

这是java还是kotlin?很抱歉,我忘了提及它,我将更新postYes,但是我收到的对象是字节数组,在我解组后,它将是一个包对象,因此instanceof将始终为false,然后你需要提供一个类加载器并调用.readValue。在你的包上,问题是我不知道哪个对象作为包(objectA或objectB)到达我这里。如果我将objectA的类加载器传递给parcel.readValue,那么它将创建对象,但是如果它是错误的,那么它将被null值填充,然后如果我检查新创建的对象是否包含null,如果它包含null,则结束,那么我将无法使用ObjectB的类加载器再次读取包裹。我正在向问题中添加示例代码,您可以尝试使用Object.class.getClassLoader()然后使用instanceof进行检查吗?或者,您可以创建一个包含ObjectA或ObjectB的包装器类,并创建一个字段来指示包装器当前包含的对象。如果我使用object.getClass.getClassLoader(),那么它将返回一个整数类,既不是ObjectA也不是ObjectB(只有getClass.getClassLoader()也是如此)编辑:我已经成功地用你建议的包装器类解决了我的问题,谢谢!你能编辑答案以包含解决方案吗?