天道酬勤,学无止境

通过意图传递可序列化对象(Pass serializable object throught intent)

问题

这是我第一次尝试寻求解决我的问题的方法,所以请尽量成为好人! 我通过简单的搜索找到了许多解决我在这个网站上处理的问题的方法,但这次我想我没有运气。 我发现没有什么适合我的问题,所以我结束了提出一个新问题。

我正在尝试将对象通过意图从一个活动传递到另一个活动。 我有一个抽象类和两个子类(其中一个也是抽象的),如下所示。 我需要它们是抽象的。 我删除了很多代码(抽象方法等)只是为了找出问题所在,最终我得到了这些非常简单的类,但我仍然遇到同样的问题。

public abstract class MyObject {

    private boolean New;
    private boolean Modified;

    public MyObject() {
        New = true;
    }

    public boolean isNew() {
        return New;
    }

    protected void setNew(boolean value) {
        New = value;
    }

    protected boolean isModified() {
        return Modified;
    }

    protected void setModified(boolean value) {
        Modified = value;
    }

}

public abstract class MyItemBase extends MyObject {

    private Long Id;
    private String Description;

    public MyItemBase() {
        super();
    }

    public Long getId() {
        return Id;
    }

    public void setId(Long id) {
        Id = id;
    }

    public String getDescription() {
        return Description;
    }

    public void setDescription(String description) {
        Description = description;
    }

}

public class MyItem extends MyItemBase implements Serializable {

    private static final long serialVersionUID = -2875901021692711701L;

    public MyItem() {
        super();
    }

}

我有两个活动,ActivityA 和一个按钮来调用 ActivityB,如下所示。

public class ActivityA extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);

        Button btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),
                        ActivityB.class);

                MyItem item = new MyItem();
                item.setId((long) 1);
                item.setDescription("test");

                intent.putExtra("MyItem", (Serializable) item);
                startActivityForResult(intent, 1);
            }

        });
    }

}

public class ActivityB extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);

        MyItem item = (MyItem) getIntent().getSerializableExtra("MyItem");
        ((TextView) findViewById(R.id.text)).setText(item.getDescription());
    }

}

因此,当我从第二个活动接收 MyItem 时,完全没有错误,属性 Id 和 Description 都为空。 实际上它是一个新对象,因为 New 属性为真。 现在,如果我在将对象放入第一个 Activity 中的意图之后尝试获取该对象

intent.putExtra("MyItem", (Serializable) item);
MyItem newItem = (MyItem) intent.getSerializableExtra("MyItem");
startActivityForResult(intent, 1);

它工作正常。 newItem 具有具有正确值的所有属性。

有任何想法吗?

提前谢谢大家!

回答1

来自官方 Serializable 文档:

未实现此接口的类将不会对其任何状态进行序列化或反序列化。 可序列化类的所有子类型本身都是可序列化的。

您的基类没有实现Serializable ,所以它的字段没有被序列化。

使MyItemBase (或什至MyObject )可Serializable ,其所有后代也将变为可Serializable (无需显式实现接口)。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何使用意图将对象从一个Android活动发送到另一个?(How to send an object from one Android Activity to another using Intents?)
    问题 如何使用Intent类的putExtra()方法将自定义类型的对象从一个Activity传递到另一个Activity? 回答1 如果您只是传递对象,那么Parcelable就是为此而设计的。 与使用Java的本机序列化相比,使用它需要付出更多的努力,但是它的速度更快(我的意思是, WAY更快)。 在文档中,有关如何实现的一个简单示例是: // simple class that just has one member property as an example public class MyParcelable implements Parcelable { private int mData; /* everything below here is for implementing Parcelable */ // 99.9% of the time you can just ignore this @Override public int describeContents() { return 0; } // write your object's data to the passed-in Parcel @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(mData); }
  • 如何在Android上将对象从一项活动传递到另一项活动(How to pass an object from one activity to another on Android)
    问题 我正在尝试从一个Activity发送客户类的对象,并在另一个Activity显示它。 客户类的代码: public class Customer { private String firstName, lastName, Address; int Age; public Customer(String fname, String lname, int age, String address) { firstName = fname; lastName = lname; Age = age; Address = address; } public String printValues() { String data = null; data = "First Name :" + firstName + " Last Name :" + lastName + " Age : " + Age + " Address : " + Address; return data; } } 我想将其对象从一个Activity发送到另一个,然后在另一个Activity上显示数据。 我该如何实现? 回答1 一种选择是让您的自定义类实现Serializable接口,然后可以使用Intent#putExtra()方法的putExtra(Serializable..)变体在意图中额外传递对象实例。
  • How to pass ArrayList of Objects from one to another activity using Intent in android?(How to pass ArrayList of Objects from one to another activity using Intent in android?)
    问题 我的onClick()方法中的代码中包含以下内容 List<Question> mQuestionsList = QuestionBank.getQuestions(); 现在,我有这行之后的意图,如下所示: Intent resultIntent = new Intent(this, ResultActivity.class); resultIntent.putParcelableArrayListExtra("QuestionsExtra", (ArrayList<? extends Parcelable>) mQuestionsList); startActivity(resultIntent); 我不知道如何将意图中的问题列表从一个活动传递到另一个活动 public class Question { private int[] operands; private int[] choices; private int userAnswerIndex; public Question(int[] operands, int[] choices) { this.operands = operands; this.choices = choices; this.userAnswerIndex = -1; } public int[] getChoices() { return
  • 使用Serializable通过意图传递数据(Passing data through intent using Serializable)
    问题 我已经使用可序列化实现了我的课程,但仍然无法正常工作。 这是我的课: package com.ursabyte.thumbnail; import java.io.Serializable; import android.graphics.Bitmap; public class Thumbnail implements Serializable { private static final long serialVersionUID = 1L; private String label = ""; private Bitmap bitmap; public Thumbnail(String label, Bitmap bitmap) { this.label = label; this.bitmap = bitmap; } public void set_label(String label) { this.label = label; } public String get_label() { return this.label; } public void set_bitmap(Bitmap bitmap) { this.bitmap = bitmap; } public Bitmap get_bitmap(){ return this.bitmap; } //
  • 无法在Intent中传递自定义对象:Intent类型的Extra Put方法不明确(Cannot pass custom Object in an Intent: The Method Put Extra is Ambiguous for the type Intent)
    问题 如果我尝试写 Car myCarObject=getCar(); Intent details = new Intent(Start.this, DetailsCar.class); details.putExtra("Car", myCarObject); startActivity(details); Eclipse在该行中向我显示了一个编译错误“该方法对于Intent类型来说是多余的” details.putExtra("Car", myCarObject); 如果我使用代码 Car myCarObject=getCar(); ArrayList<Car> parcelableExtra = new ArrayList<Car>(); parcelableExtra.add(myCarObject); Intent details = new Intent(Start.this, DetailsCar.class); details.putExtra("Car", parcelableExtra); startActivity(dettagli); 我尝试在目标Intent中使用此代码加载额外的内容 ArrayList<Car> parcelableExtra = new ArrayList<Car>(); parcelableExtra = (ArrayList
  • 将可序列化数组从一个活动传递到另一个活动时,类强制转换异常(Class Cast Exception when passing array of Serializables from one activity to another)
    问题 我有一个包含可序列化对象的数组,并且正在尝试使用Intent的putExtra()和Bundle的getSerializable()。 但是,我收到一个类强制转换异常,并且不明白为什么。 下面是代码。 UserInfo是我自己的实现Serializable的类,并且我已经能够在活动之间传递单个UserInfo对象。 尝试使用数组时,我只遇到了这个问题。 发送可序列化代码: Intent intent = new Intent( JOIN_GROUP ); //JOIN_GROUP is a constant string String user_ids[] = packet.userIDs(); int length = user_ids.length; UserInfo users[] = new UserInfo[length]; for ( int i = 0; i < length; ++i ) users[i] = getUserByID( user_ids[i] ); intent.putExtra( USERS_IN_GROUP, users ); 检索可序列化的代码: Bundle extra = intent.getExtras(); String action = intent.getAction(); if ( action.equals
  • 如何在Android上将对象从一项活动传递到另一项活动? [复制](How do I pass an object from one activity to another on Android? [duplicate])
    问题 这个问题已经在这里有了答案: 如何在Android上将对象从一项活动传递到另一项活动(32个答案) 7年前关闭。 我需要能够在我的应用程序的多个活动中使用一个对象,并且它必须是同一对象。 做这个的最好方式是什么? 我尝试将对象设置为“公共静态”,以便可以通过其他活动访问它,但是由于某种原因,这并没有减少它的使用。 还有另一种方法吗? 回答1 创建意图对象时,可以利用以下两种方法在两个活动之间传递对象。 putParcelable putSerializable 您可以让您的类实现Parcelable或Serializable。 然后,您可以在各个活动中传递自定义类。 我发现这非常有用。 这是我正在使用的一小段代码 CustomListing currentListing = new CustomListing(); Intent i = new Intent(); Bundle b = new Bundle(); b.putParcelable(Constants.CUSTOM_LISTING, currentListing); i.putExtras(b); i.setClass(this, SearchDetailsActivity.class); startActivity(i); 在新开始的活动代码中将是这样的…… Bundle b = this.getIntent(
  • 将用户定义对象的arraylist传递给Intent android(Pass arraylist of user defined objects to Intent android)
    问题 我试图将arraylist的结构传递给意图,如下所示,在我正在使用的调用函数中 ArrayList<Parliament> s=(ArrayList<Parliament>)msg.obj; Intent i = new Intent(ReadTasks.this, GenrateTasks.class); i.putExtra("tasks", s); startActivity(i); 并在被调用的函数中 Bundle b = getIntent().getExtras(); if(b!=null) { ArrayList<Parliament> as = (ArrayList<Parliament>)b.getSerializable("tasklist"); } 我在两个类中都提供了可序列化的实现,但是在行开始活动时,无法在调用函数中编组..运行时错误。 请帮助如何进行! 编辑1:堆栈跟踪: 04-01 22:21:53.999: E/AndroidRuntime(2078): FATAL EXCEPTION: main 04-01 22:21:53.999: E/AndroidRuntime(2078): java.lang.RuntimeException: Parcel: unable to marshal value com.viralm.readjson
  • 使用可序列化将数据列表从一种意图传递到另一种意图(passing a list of data from one intent to another using serializable)
    问题 我想解析从一个意图到另一个意图的数据列表 但是,使用我的代码,我只能设法在listview中传递第一项。 我使用log.d检查项目,并意识到只有一项通过。 在我的列表视图中有2个项目,当我将其传递给我的下一个意图时,日志中仅显示了一个项目。 我在课堂上做了可序列化的事情。 我在摘要中创建了一个日志,但是,当我单击摘要时,并非所有数据中都显示了该日志。 日志猫: 01-28 18:20:49.218: D/Bundle(20278): bundle : Bundle[{clickedpreOdometer=, clickedID=2, clickedCost= 12.0, clickedDate=27/12/2014, pojoArrayList=[com.example.fuellogproject.fuelLogPojo@43bf3f18, com.example.fuellogproject.fuelLogPojo@43bf5b68], clickedPump=3, clickedPrice=4, clickedFCon= 0.0, clickedOdometer=3}] 列表显示 public void summaryClick (View v) { Intent sum = new Intent(this, summary.class); fuelLogPojo
  • 使用意图将数据从一个活动转移到另一个活动(Transfer data from one Activity to Another Activity Using Intents)
    问题 我希望能够将数据从一个活动转移到另一个活动。 如何才能做到这一点? 回答1 通过以下代码,我们可以在活动之间发送值 在家长活动中使用以下代码 Intent myintent=new Intent(Info.this, GraphDiag.class).putExtra("<StringName>", value); startActivity(myintent); 在子活动中使用以下代码 String s= getIntent().getStringExtra(<StringName>); 回答2 您可以通过几种方法访问其他类或Activity中的变量或对象。 A.数据库 B.共享的首选项。 C.对象序列化。 D.可以保存公共数据的类可以命名为Common Utilities,它取决于您。 E.通过意图和可打包接口传递数据。 这取决于您的项目需求。 A.数据库 SQLite是一个嵌入到Android中的开源数据库。 SQLite支持标准的关系数据库功能,例如SQL语法,事务和准备好的语句。 教程-http://www.vogella.com/articles/AndroidSQLite/article.html B.共享首选项 假设您要存储用户名。 因此,现在将有两件事:关键用户名,值值。 储存方式 // Create object of SharedPreferences
  • 在 Intent 中传递对象引用而不实现 Serializable 或 Parcelable(Pass Object reference within Intent without implementing Serializable or Parcelable)
    问题 我知道类似的问题已经被问过多次。 我想我读了大部分。 但没有一个答案是适用的。 我需要通过意图(活动调用/广播)传递复杂的对象。 一切都在我的过程中完成。 这就是为什么我认为没有理由将我的对象写入 Streams 只是为了在几毫秒后重新组装它们。 我想通过我的应用程序传递我的对象引用。 有没有办法做到这一点。 由于我的应用程序将连续多次广播同一事件,因此我不能依赖静态成员。 我需要为我广播的内容获得完全相同的对象。 这就是为什么我在考虑一个静态的“Referenceholder”,它会接受一个对象并返回一个整数,在它的内部列表中标识这个对象,这样我就可以通过 .putExtras 传递这个整数。 但据我所知 Java,我无法在添加后从这个列表中清除这个对象,因为多个侦听器可能对同一个对象感兴趣,我必须永远将它保留在我的 Referenceholder 中(假设一个线程可以随时恢复 - 甚至 2 分钟后)。 有任何想法吗? 难道我做错了什么? 或者关于如何清理我的引用的任何想法(可能在几秒钟后?这可能会导致崩溃,但它似乎比编写无缘无故地组装和重新组装我的对象的代码更适用) 回答1 您的选择非常明确:无法在 Intent 中传递不可编组对象(Parcelable、Serializable)。 句号。 您可能能够做的是传递一些对不可编组对象的引用。 这个想法是
  • 在活动之间共享数据的最佳方法是什么?(What's the best way to share data between activities?)
    问题 我有一个活动,它是整个应用程序中使用的主要活动,它具有许多变量。 我还有另外两个活动,我希望能够使用第一个活动中的数据。 现在我知道我可以做这样的事情: GlobalState gs = (GlobalState) getApplication(); String s = gs.getTestMe(); 但是我想共享很多变量,有些可能很大,所以我不想像上面那样创建它们的副本。 有没有一种方法可以直接获取和更改变量而无需使用get和set方法? 我记得在Google开发者网站上读过一篇文章,建议不要在Android上使用此功能。 回答1 这里是实现此目的的最常用方法的汇编: 在意图内发送数据静态场 HashMap的WeakReferences 持久对象(sqlite,共享首选项,文件等) TL; DR :有两种共享数据的方式:在Intent的Extras中传递数据或将其保存在其他地方。 如果数据是基元,字符串或用户定义的对象,则将其作为附加意图的一部分发送(用户定义的对象必须实现Parcelable )。 如果传递复杂对象,则将实例保存在其他位置的一个实例中,然后从启动的活动中访问它们。 有关如何以及为何实施每种方法的一些示例: 在意图内发送数据 Intent intent = new Intent(FirstActivity.this, SecondActivity
  • 如何在活动之间传递绘画(How to pass drawable between activities)
    问题 如何在活动之间传递图像,可绘制类型? 我尝试这样: private Drawable imagen; Bundle bundle = new Bundle(); bundle.putSerializable("imagen", (Serializable) unaReceta.getImagen()); Intent myIntent = new Intent(v.getContext(), Receta.class); myIntent.putExtras(bundle); startActivityForResult(myIntent, 0); 但是它报告了我的执行情况: java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable 回答1 1)在意图传递作为额外 在活动A中,您可以解码图像并通过意图将其发送: 使用此方法(附加),图像在162毫秒的时间间隔内通过 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap
  • 如何将值从一个活动传递到上一个活动(How to pass the values from one activity to previous activity)
    问题 如何将值从一个屏幕传递到其前一个屏幕? 考虑这种情况:我有两个活动。 第一个屏幕有一个TextView和一个按钮,第二个活动有一个EditText和一个按钮。 如果我单击第一个按钮,则它必须移至第二个活动,并且此处用户必须在文本框中键入一些内容。 如果他从第二个屏幕上按下按钮,则文本框中的值应移至第一个活动,并应显示在第一个活动TextView 。 回答1 要捕获对另一个活动中的一个活动执行的操作,需要三个步骤。 通过使用主活动中的startActivityForResult将辅助活动(您的“编辑文本”活动)作为子活动启动。 Intent i = new Intent(this,TextEntryActivity.class); startActivityForResult(i, STATIC_INTEGER_VALUE); 在子活动中,您不仅需要在用户单击按钮时关闭活动,还需要创建一个新的Intent,并将输入的文本值包含在其Extras包中。 要将其传递回父调用setResult然后再调用finish关闭第二个Activity。 Intent resultIntent = new Intent(); resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue); setResult
  • 通过意图传递枚举或对象(最佳解决方案)(Passing enum or object through an intent (the best solution))
    问题 我有一个活动,启动时需要访问两个不同的ArrayList。 这两个列表都是我自己创建的不同对象。 基本上,我需要一种将这些对象从Intent传递到活动的方法。 我可以使用addExtras(),但这需要一个Parceable兼容类。 我可以使我的类可序列化传递,但是据我了解,这会使程序变慢。 我有什么选择? 我可以通过枚举吗? 顺便说一句:有没有一种方法可以将参数从Intent传递给Activity构造函数? 回答1 这是一个古老的问题,但是每个人都没有提到Enum实际上是可Serializable ,因此可以作为额外的东西完美地添加到Intent中。 像这样: public enum AwesomeEnum { SOMETHING, OTHER; } intent.putExtra("AwesomeEnum", AwesomeEnum.SOMETHING); AwesomeEnum result = (AwesomeEnum) intent.getSerializableExtra("AwesomeEnum"); 建议使用静态变量或应用程序范围的变量是一个非常糟糕的主意。 这确实将您的活动与状态管理系统耦合在一起,并且很难维护,调试和解决问题。 备择方案: tedzyc指出了一个很好的观点,即Oderik提供的解决方案会给您带来错误。 但是,提供的替代方法使用起来有些麻ƒ
  • 如何在Android应用程序的“活动”之间传递数据?(How do I pass data between Activities in Android application?)
    问题 我有一种情况,在通过登录页面登录后,每个activity上都会有一个退出button 。 点击sign-out ,我将传递已登录用户的session id以便退出。 谁能指导我如何使session id可供所有activities ? 这种情况的任何替代方法 回答1 最简单的方法是将会话ID传递给您用来启动活动的Intent的注销活动: Intent intent = new Intent(getBaseContext(), SignoutActivity.class); intent.putExtra("EXTRA_SESSION_ID", sessionId); startActivity(intent); 访问下一个活动的意图: String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID"); Intents文档提供了更多信息(请参阅标题为“其他”的部分)。 回答2 在您当前的活动中,创建一个新的Intent : String value="Hello world"; Intent i = new Intent(CurrentActivity.this, NewActivity.class); i.putExtra("key",value); startActivity(i); 然后在新的活动中
  • 如何通过捆绑发送对象(How to send objects through bundle)
    问题 我需要通过一个捆绑包传递对我的大部分处理工作的类的引用。 问题在于它与意图或上下文无关,并且具有大量非原始对象。 如何将类打包为可打包/可序列化的类,并将其传递给startActivityForResult ? 回答1 弄清楚走哪条路不仅需要回答CommonsWare的关键问题“为什么”,还需要回答“到什么?”的问题。 你在传递它吗? 现实情况是,唯一可以通过捆绑销售的商品是纯数据-其他所有内容都基于对数据含义或指向的解释。 您不能从字面上传递对象,但是您可以做的是以下三件事之一: 1)您可以将对象分解成其构成数据,并且如果另一端具有相同类型的对象的知识,则可以从序列化数据中组装一个副本。 这就是大多数常见类型通过包传递的方式。 2)您可以传递不透明的手柄。 如果在同一上下文中传递它(尽管可能会问为什么要打扰),那么它将是一个可以调用或取消引用的句柄。 但是,如果您通过Binder将其传递到其他上下文,则其字面值将是任意数字(实际上,这些任意数字从启动起便会按顺序计数)。 除了跟踪它之前,您什么也不能做,除非将其传递回原始上下文,这将使Binder将其转换回原始句柄,从而使其再次变得有用。 3)您可以传递魔术句柄,例如文件描述符或对某些os / platform对象的引用,如果设置了正确的标志,则Binder将创建一个指向接收者相同资源的克隆,该克隆实际上可以在接收者上使用
  • 可打包遇到IOException,正在编写可序列化的对象getactivity()(Parcelable encountered IOException writing serializable object getactivity())
    问题 所以我在logcat中得到这个: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.resources.student_list.Student) 我知道这意味着我的学生课无法序列化,但是,这是我的学生课: import java.io.Serializable; public class Student implements Comparable<Student>, Serializable{ private static final long serialVersionUID = 1L; private String firstName, lastName; private DSLL<Grade> gradeList; public Student() { firstName = ""; lastName = ""; gradeList = new DSLL<Grade>(); } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName =
  • Java中额外的数组列表意图(Array List Intent extra in Java [closed])
    问题 It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center. Closed 8 years ago. I am trying to skip my ArrayList through Intent. But I cannot find what to write in extra? Any get methods I am getting errors like "not applicable for string." Item Details: public class ItemDetails { public String getName() { return name; } public void setName(String name) { this.name = name; } public String
  • 在Android中将对象从一个活动传递到另一个活动的列表(Pass list of objects from one activity to other activity in android)
    问题 我想从一个活动传递另一个活动的对象列表。 我在下面有一类SharedBooking : public class SharedBooking { public int account_id; public Double betrag; public Double betrag_effected; public int taxType; public int tax; public String postingText; } 呼叫活动中的代码: public List<SharedBooking> SharedBookingList = new ArrayList<SharedBooking>(); public void goDivision(Context context, Double betrag, List<SharedBooking> bookingList) { final Intent intent = new Intent(context, Division.class); intent.putExtra(Constants.BETRAG, betrag); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); context.startActivity(intent); } 调用活动的代码: Bundle