【问题标题】:Parcelable encountered IOException writing serializable object?Parcelable 在写入可序列化对象时遇到 IOException?
【发布时间】:2014-08-03 03:03:14
【问题描述】:

我在此代码上收到“Parcelable 遇到 IOException writing serializable object”错误

public void onClick(View v) {
                tvResult.setText("Povezivanje s bazom u tijeku...");
                Intent i = new Intent("android.intent.action.MAINACTIVITY");

                Details details = new Details();
                details.host=etHost.getText().toString();
                details.user=etUsername.getText().toString();
                details.pass=etPass.getText().toString();
                details.database=etBaza.getText().toString();

                new GetData(tvResult).execute("");

                Bundle bundle = new Bundle();
                bundle.putSerializable("Detalji", details);
                i.putExtras(bundle);
                startActivity(i);

            }

这也是我的详细信息类:

public class Details implements Serializable 
    {

        private static final long serialVersionUID = 1L;
        private String host;
        private String pass;
        private String user;
        private String database;
    }

startActivity(i) 命令之前一切正常,有人知道为什么吗?

【问题讨论】:

  • 如果这就是您在 Details 课程中的全部内容,那么它甚至不应该做任何事情吗?我很确定它甚至不应该编译。这些是私有变量,你不能像这样以公共方式访问它们。
  • 它已编译,私有变量没有错误,它们存储在意图中
  • 我对它的工作原理感到困惑,details.host=etHost.getText().toString();(和其他详细信息。* 调用)应该给出错误,您需要将可见性更改为默认值,或者您需要添加一个 getter并设置您的变量。
  • 我更改了隐私但仍然是同样的错误
  • @zgc7009 当 Details 是 Inner 类时,这实际上有效。我也想知道,只是测试了一下。

标签: java android serialization


【解决方案1】:

在 Details 类中你是否重写了 writeToParcel 和 readFromParcel?

@Override
    public void writeToParcel(Parcel dest, int flags) {
}

如果你想通过intents传递复杂的对象,Details需要实现Parceleable。

Details 类需要在它自己的文件中,你没有实现 parcelable。

【讨论】:

  • 以上是我在那个详细信息类中的所有内容
  • 只是确保当您将其传递给意图时这些变量都不为空,您可以发布您的 logcat 来验证吗?
  • sry 我是 Eclipse 新手,不知道如何导出整个 logcat 日志
  • 哦,你可以只发送一部分。有错误的那个。在 mac 或 pc 上使用“adb logcat”从命令行复制更容易吗?
  • 将它移到它自己的文件中,它应该可以工作。如果这回答了您的问题,请点击接受。
【解决方案2】:

你必须在你的数据类Details中实现Parcelable

public class Details implements Serializable, Parcelable {
    private static final long serialVersionUID = 1L;
    private String host;
    private String pass;
    private String user;
    private String database;

    public Details(Parcel in){
       this.host = in.readString();
       this.pass = in.readString();
       this.user = in.readString();
       this.database = in.readString();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.host);
        dest.writeString(this.pass);
        dest.writeString(this.user);
        dest.writeString(this.database);
    }

    public static final Parcelable.Creator<Details> CREATOR = new Parcelable.Creator<Details>() {
        public Details createFromParcel(Parcel in) {
            return new Details(in); 
        }

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

现在我试着写一些对你有用的东西,但我不能 100% 确定它会,所以从这里做一些额外的阅读:

【讨论】:

  • 不需要实现 Serializable 吧?似乎 Parcelable 应该处理所有事情。
  • 是的,这是我复制的作者代码留下的。它可能仍然有用,因为您也可以将其用作 Serializable,但据说在 Android 中序列化并不快。
猜你喜欢
  • 2013-04-30
  • 2020-07-22
  • 2013-08-11
  • 2018-01-02
  • 2016-01-25
  • 2014-06-02
  • 2014-07-19
相关资源
最近更新 更多