首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Java/Android中正确实现parcel/parcelable in a Hash of objects

如何在Java/Android中正确实现parcel/parcelable in a Hash of objects
EN

Stack Overflow用户
提问于 2013-05-17 09:35:29
回答 1查看 2.4K关注 0票数 0

我有以下课程:实验和测量。我在Android活动之间传递一个包含实验对象的HashMap作为值,并将它们的Experiment.getExperimentName作为键。

这些实验对象又包含测量对象的HashMap。此HashMap将测量对象作为值,并将其Measurements.getMeasurements作为关键字。

然后,这些测量对象包含一个双精度的ArrayList。

我尝试了许多使用捆绑包或直接放入包裹的变体,但当我在新的活动中读取HashMap时,我总是得到一个“解组时的ClassNotFoundException: nl.bioinf.thema12.labpal.objects.Measurements”“。

如何正确实现parcel/parcelable?

实验课:

代码语言:javascript
运行
AI代码解释
复制
package nl.bioinf.thema12.labpal.objects;
import java.util.HashMap;
//import java.util.Set;

import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;

/**
 * @author roy
 * a class which describes an experiment
 */
public class Experiment implements Parcelable{
    private String experimentName = "";
    private HashMap<String,Measurements> measurements = new HashMap<String,Measurements>();

    //every Experiment needs a name to make it unique
    public Experiment(String experimentName) {
        this.experimentName=experimentName;
    }

    /**
     * a method which adds values to a measurement
     * @param   measurementName the name of the measurement you want to write a value to
     * @param   measurement the value of the measurement you want to add
     * @return  the sequence from the fasta
     */
    public void addValueToMeasurements(String measurementName, double measurement){
        //try to add the measurement
        if(measurements.get(measurementName)== null){
            Measurements m = new Measurements(measurementName);
            m.addMeasurement(measurement);
            measurements.put(measurementName,m);
        }
        //if the measurement does not exist, create it
        else{
            measurements.get(measurementName).addMeasurement(measurement);  
        }
    }
    /**
     * a method which returns the experiment name
     * @return  the experiment name
     */ 
    public String getExperimentName(){
        return experimentName;
    }



    //This makes the object parselable, I don't understand why
    /**
     * a constructor for the parcelable variant of the object
     */     
    public Experiment(Parcel in){
        measurements = new HashMap<String,Measurements>();
        readFromParcel(in);
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    /**
     * a method which writes the objects to a parcel
     */ 
    public void writeToParcel(Parcel dest, int flags) {
        //dest.writeString(experimentName);
        //for(String s: (Set<String>)measurements.keySet()){
            //dest.writeString(s);
            //dest.writeValue(measurements.get(s));
        //}
        Bundle b = new Bundle();
        b.putString("experimentName", experimentName);
        b.putSerializable("measurements", measurements);
        dest.writeBundle(b);
    }

    /**
     * a method which reads from a parcel
     */ 
    public void readFromParcel(Parcel in){
        //experimentName = in.readString();
        Bundle b = in.readBundle();
        experimentName = b.getString("experimentName");
        measurements = (HashMap<String, Measurements>)b.getSerializable("measurements");
    }

    /**
     * generic parcelable creator method
     */ 
    public static final Parcelable.Creator CREATOR =
        new Parcelable.Creator() {
            public Experiment createFromParcel(Parcel in) {
                return new Experiment(in);
            }

            public Experiment[] newArray(int size) {
                return new Experiment[size];
            }
     };


}

测量类

代码语言:javascript
运行
AI代码解释
复制
package nl.bioinf.thema12.labpal.objects;

import java.util.ArrayList;

import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
/**
 * @author roy
 * a class which describes a group of measurements
 */

public class Measurements implements Parcelable{
    private ArrayList<Double> measurements;
    private String measurementName;

    //each measurement has at least a name and an empty list of measurements
    public Measurements(String measurementName) {
        this.measurementName=measurementName;
        measurements = new ArrayList<Double>();
    }

    /**
     * a method which adds a measurement to an ArrayList of measurements
     * @param   measurement a measurement to add to the ArrayList
     */
    public void addMeasurement(double measurement){
        measurements.add(measurement);
        System.out.println("added a measurement");
    }

    /**
     * a method which returns the measurement name
     * @return  the measurement name
     */
    public String getMeasurementName(){
        return measurementName;
    }

    /**
     * a method which returns an ArrayList of the values in the measurement
     * @return  the values of the measurements in an ArrayList
     */
    public ArrayList<Double> getMeasurements(){
        return measurements;
    }

    //This makes the object parselable, I don't understand why
    /**
     * a constructor for the parcelable variant of the object
     */     
    public Measurements(Parcel in){
        measurements = new ArrayList<Double>();
        readFromParcel(in);

    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    /**
     * a method which writes the objects to a parcel
     */ 
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        //dest.writeString(measurementName);
        //dest.writeList(measurements);
        Bundle b = new Bundle();
        b.putString("measurementName", measurementName);
        b.putSerializable("measurements", measurements);
    }

    /**
     * a method which reads from a parcel
     */ 
    public void readFromParcel(Parcel in){
        //measurementName = in.readString();
        //measurements = in.readArrayList(Object.class.getClassLoader());
        Bundle b = in.readBundle();
        measurementName = b.getString("measurementName");
        measurements = (ArrayList<Double>)b.getSerializable("measurements");
    }

    /**
     * generic parcelable creator method
     */ 
    public static final Parcelable.Creator CREATOR =
        new Parcelable.Creator() {
            public Measurements createFromParcel(Parcel in) {
                return new Measurements(in);
            }

            public Measurements[] newArray(int size) {
                return new Measurements[size];
            }
     };
}

接收包的活动的代码

代码语言:javascript
运行
AI代码解释
复制
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //get the intent passed by the other activity
    Bundle b = getIntent().getExtras();
    experiment = b.getParcelable("nl.bioinf.thema12.labpal.objects.Experiment");
    setContentView(R.layout.activity_show_table);
}

用于发送包的活动的代码

代码语言:javascript
运行
AI代码解释
复制
//setup the table button
        table = (Button)findViewById(R.id.button_activityMain_table);
        table.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v){
                try{
                    Intent intentToPassToShowTable = new Intent(MainActivity.this, ShowTable.class);
                    Bundle b = new Bundle();
                    b.putParcelable("nl.bioinf.thema12.labpal.objects.Experiment", experiments.get(experimentName.getSelectedItem().toString()));
                    intentToPassToShowTable.putExtras(b);
                    startActivity(intentToPassToShowTable);
                }
                catch(Exception e){
                    e.printStackTrace();
                }
            }
        });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-17 11:41:14

嗨,试试这段代码,它运行得很好

代码语言:javascript
运行
AI代码解释
复制
  package com.example.objectsharing;

import java.util.ArrayList;
 import java.util.HashMap;

import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;

public class Experiment implements Parcelable {
private String experimentName = "";
private HashMap<String, ArrayList<Double>> measurements = new HashMap<String, ArrayList<Double>>();

// every Experiment needs a name to make it unique
public Experiment(String experimentName) {
    this.experimentName = experimentName;
}

/**
 * a method which adds values to a measurement
 * 
 * @param measurementName
 *            the name of the measurement you want to write a value to
 * @param measurement
 *            the value of the measurement you want to add
 * @return the sequence from the fasta
 */
public void addValueToMeasurements(String measurementName,
        double measurement) {
    // try to add the measurement
    if (measurements.get(measurementName) == null) {
        // Measurements m = new Measurements(measurementName);
        ArrayList<Double> _data = new ArrayList<Double>();
        // m.addMeasurement(measurement);
        _data.add(measurement);
        measurements.put(measurementName, _data);
    }
    // if the measurement does not exist, create it
    else {
        measurements.get(measurementName).add(measurement);
    }
}

/**
 * a method which returns the experiment name
 * 
 * @return the experiment name
 */
public String getExperimentName() {
    return experimentName;
}

// This makes the object parselable, I don't understand why
/**
 * a constructor for the parcelable variant of the object
 */
public Experiment(Parcel in) {
    measurements = new HashMap<String, ArrayList<Double>>();
    readFromParcel(in);
}

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
/**
 * a method which writes the objects to a parcel
 */
public void writeToParcel(Parcel dest, int flags) {
    // dest.writeString(experimentName);
    // for(String s: (Set<String>)measurements.keySet()){
    // dest.writeString(s);
    // dest.writeValue(measurements.get(s));
    // }
    Bundle b = new Bundle();
    b.putString("experimentName", experimentName);
    b.putSerializable("measurements", measurements);
    dest.writeBundle(b);
}

/**
 * a method which reads from a parcel
 */
public void readFromParcel(Parcel in) {
    // experimentName = in.readString();
    Bundle b = in.readBundle();
    experimentName = b.getString("experimentName");
    measurements = (HashMap<String, ArrayList<Double>>) b
            .getSerializable("measurements");
}

/**
 * generic parcelable creator method
 */
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public Experiment createFromParcel(Parcel in) {
        return new Experiment(in);
    }

    public Experiment[] newArray(int size) {
        return new Experiment[size];
    }
};

}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16605864

复制
相关文章
parcel和parcelable
Parcel 在英文中有两个意思,其一是名词,为包裹,小包的意思; 其二为动词,意为打包,扎包。邮寄快递中的包裹也用的是这个词。Android采用这个词来表示封装消息数据。这个是通过IBinder通信的消息的载体。需要明确的是Parcel用来存放数据的是内存(RAM),而不是永久性介质(Nand等)。 Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。 接口的
xiangzhihong
2018/01/30
9230
Android跨进程通信IPC之4——AndroidIPC基础1
这里强烈建议把前面两篇文章看一遍,因为前面两篇文章对后面大家对android的IPC的理解帮助很大,本片文章主要内容如下
隔壁老李头
2018/08/30
1.3K0
Android跨进程通信IPC之4——AndroidIPC基础1
漫谈序列化—使用、原理、问题
说到对象,是一个比较宽泛的概念,简单的说,他就是类的一个实例,有状态和行为,存活在内存中,一旦JVM停止运行,对象的状态也会丢失。
码上积木
2021/02/08
9040
Android Parcelable
      Paracelable是android自己的实现序列化的接口,是anroid推荐使用的.那么什么事序列化呢?简单来说就是将对象转换为可以传输的二进制流(二进制序列)的过程,这样我们就可以通过序列化,转化为可以在网络传输或者保存到本地的流(序列),从而进行传输数据 ,那反序列化就是从二进制流(序列)转化为对象的过程
android_薛之涛
2018/09/12
6250
Android  Parcelable
Android 反序列化漏洞攻防史话
Java 在历史上出现过许多反序列化的漏洞,但大部分出自 J2EE 的组件。即便是 FastJSON 这种漏洞,似乎也很少看到在 Android 中被实际的触发和利用。本文即为对历史上曾出现过的 Android Java 反序列化漏洞的分析和研究记录。
evilpan
2023/03/27
1.9K0
Android 反序列化漏洞攻防史话
Android Parcelable
Interface for classes whose instances can be written to and restored from a Parcel. 
阳光岛主
2019/02/19
6260
Android进程间通信(一):基础介绍
进程间通信 即 IPC机制,IPC 全称为 Inter-Process Communication。
103style
2022/12/19
3160
android-Parcelable
public class Book implements Parcelable { public int bookId; public String bookName; public Book(int bookId, String bookName) { this.bookId = bookId; this.bookName = bookName; } public int describeContents() {
tea9
2022/07/16
1720
Android--Binder机制与AIDL
Binder机制核心点就是利用mmap开辟一块空间,使得多个进程可以访问,不仅接收端持有该映射,内核空间也持有,由于相当于内存,所以拷贝只需要一次:从发送端进程的工作内存(用户空间)到主内存(内核空间)的内存映射中,接收端也就相当于接收到了,想要深入理解可以查看Java--深入理解JMM模型、Java并发特性
aruba
2021/12/06
8980
Android--Binder机制与AIDL
Android序列化总结
公园里,一位仙风鹤骨的老者在打太极,一招一式都仙气十足,一个年轻人走过去:“大爷,太极这玩意儿花拳绣腿,你练它干啥?”老者淡淡一笑:“年轻人,你还没有领悟到太极的真谛,这样,你用最大力气打我试试。”于是年轻人用力打了老头一拳,被讹了八万六。
大公爵
2018/09/05
8410
Android序列化总结
Serializable和Parcelable的再次回忆
自己开发Android也有些时间了,Serializable和Parcelable遇到过不止一次了。但是每次别人问起具体的内容自己偏偏记得不是很清晰。因为某些原因再次梳理一下,以文章的形式给自己存储下来。温故而知新!!
静默加载
2020/05/31
6090
android之Parcelable介绍
Parcelable类的概述在SDK中是这样的:这些类的接口可以将实例写入或从中还原 Parcel。
李小白是一只喵
2020/12/31
6550
Android中的序列化:Parcelable和Serializable
概述 序列化:将一个对象转换成 可存储或 可传输的状态。 Parcelable和Serializable的区别 作用 Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。 Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。 性能比
用户1205080
2018/12/21
7900
Android开发之漫漫长途 X——Android序列化
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!另外,本系列文章知识可能需要有一定Android开发基础和项目经验的同学才能更好理解,也就是说该系列文章面向的是Android中高级开发工程师。
LoveWFan
2018/08/07
4010
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )
在上一篇博客 【Binder 机制】AIDL 分析 ( 创建 AIDL 文件 | 创建 Parcelable 类 | AIDL 中使用 Parcelable 类 | 编译工程生成 AIDL 对应的Java源文件 ) 创建了 AIDL 文件 , 并编译生成了 AIDL 文件对应的 Java 源文件 , 现在开始分析生成在 " AIDL_Demo\app\build\generated\aidl_source_output_dir\debug\out\kim\hsl\aidl_demo " 目录 中的 " IMyAidlInterface.java " 源文件 ;
韩曙亮
2023/03/29
1.8K0
Java数据的序列化总结
Android开发中经常需要用到序列化,系统提供了两个接口用来实现, · Parcelable · Serializable
PhoenixZheng
2018/08/07
2510
Parcelable与Serializable
由于 Java 的 Serializable 的性能较低,Parcelable 正式在这个背景下产生的,它核心作用就是为了解决 Android 中大量跨进程通信的性能问题。
老马的编程之旅
2022/06/22
1.2K0
点击加载更多

相似问题

Android:如何实现Parcelable to my objects?

130

如何在Android中正确使用Parcelable类

11

使用Objects.hash()还是自己的hashCode()实现?

57

android实现Parcelable时出错

20

添加到Parcel的Parcelable inside bundle

43
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档