【问题标题】:Is there any way to know what type of object is in a Parcel on Android?有什么方法可以知道 Android 上的 Parcel 中的对象类型是什么?
【发布时间】:2019-10-11 10:48:43
【问题描述】:

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

编辑:语言是 Java

编辑:添加示例代码

        ObjectA objA = new ObjectA("uid", "description");

        byte[] bytes = ParcelUtil.toBytes(objA); //this simulates the sending

        Object rebuilt = ParcelUtil.rebuildFromBytes(bytes); //here I don't know what am I rebuilding, objectA or objectB
        if(rebuilt instanceof Parcel){
            Parcel p = (Parcel) rebuilt;

            ObjectB oB = (ObjectB) p.readValue(ObjectB.class.getClassLoader());
            if(oB.getUid() == null){
                ObjectA oA = (ObjectA) p.readValue(ObjectA.class.getClassLoader()); //this will also be full of null values
            }
        }

【问题讨论】:

  • 这是 java 还是 kotlin ?
  • 它的java,抱歉我忘了说,我会更新帖子

标签: java android networking serialization parcelable


【解决方案1】:

我想您可以访问可能是您收到的对象的可能类型的类。在 Java 中,您可以简单地使用 instanceof 运算符来检查您收到的对象是什么:

if (yourObject instanceof YourClass) {
  // Your code here
}

对于 Parcels,有一个接受类加载器的 readValue 方法,使用您的类加载器调用此方法,它应该可以工作,例如:

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

https://developer.android.com/reference/android/os/Parcel#readValue(java.lang.ClassLoader)

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

【讨论】:

  • 是的,但是我收到的对象是字节数组,在我解开它之后它将是一个 Parcel 对象,因此 instanceof 将始终为 false
  • 然后你需要提供一个类加载器并在你的 Parcel 上调用 .readValue,见developer.android.com/reference/android/os/…
  • 问题是我不知道哪个对象作为包裹到达我这里(objectA 或 objectB)。如果我将objectA的ClassLoader传递给parcel.readValue,那么它将创建对象,但如果它是错误的,它将填充空值,然后如果我检查新创建的对象是否包含空值,则结束它包含 null 然后我无法使用 ObjectB 的 ClassLoader 从包裹中再次读取。我正在向问题中添加示例代码
  • 您可以尝试使用 Object.class.getClassLoader() 然后使用 instanceof 检查吗?或者,您可以创建一个包装器类,其中包含一个 ObjectA 或一个 ObjectB 以及一个指示包装器当前包含的对象的字段。
  • 如果我使用 Object.getClass.getClassLoader() 那么它返回一个 Integer 类,既不是 objectA 也不是 objectB (这也是只有 getClass.getClassLoader() 的情况编辑:我已经成功解决了我的问题使用您建议的包装类,谢谢!您能否编辑答案以包含解决方案?
猜你喜欢
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2012-05-01
相关资源
最近更新 更多