【问题标题】:Externalization/Serialization Not Working?外部化/序列化不起作用?
【发布时间】:2011-09-08 18:53:27
【问题描述】:

我正在尝试将清单对象传递给下一个活动的意图。代码如下:

CheckList 对象 (CheckList.java)

package com.test.serialization;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

import android.content.Context;
import android.widget.TableLayout;

public class CheckList extends TableLayout implements Externalizable {

public String name;
public int number_of_rows;

public CheckList() {
    super(SerializationActivity.context);
}
public CheckList(Context context) {
    super(context);
}
@Override
public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException {
    // TODO Auto-generated method stub  
}
@Override
public void writeExternal(ObjectOutput output) throws IOException {
    // TODO Auto-generated method stub  
}
}

序列化活动(SerializationActivity.java)

package com.test.serialization;

import android.app.Activity;
import android.content.Context;
import android.content.Intent; 
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class SerializationActivity extends Activity {
/** Called when the activity is first created. */
private SerializationActivity activity;
private CheckList checklist;
public static Context context;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    context = this.getApplicationContext();

    checklist = new CheckList(this.getApplicationContext());
    checklist.name="asdasd";
    checklist.number_of_rows= 5;

    activity = this;
    Button button = (Button) findViewById(R.id.button1);
    button.setOnClickListener(on_click_listener);
}

private OnClickListener on_click_listener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(activity, DeserializationActivity.class);
        Bundle bundle = new Bundle();
        bundle.putSerializable("checklist", checklist);
        intent.putExtra("checklist_bundle", bundle);
        startActivity(intent);
    }   
};

}

package com.test.serialization;

import android.os.Bundle;
import android.util.Log;

public class DeserializationActivity extends Activity {

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

    try {
        Bundle bundle = this.getIntent().getExtras();
        Bundle checklist_bundle = bundle.getBundle("checklist_bundle");
        CheckList checklist = (CheckList) checklist_bundle.getSerializable("checklist");

        Log.d("LOG_TAG", checklist.name);
        Log.d("LOG_TAG", checklist.number_of_rows);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

我知道通过静态方式从 Activity 调用上下文很奇怪,但我不知道在尝试序列化视图对象时如果没有它我该怎么做。

这里的问题是我的清单名称和行数将为空和0。

如何正确传递值?

【问题讨论】:

    标签: java android serialization deserialization


    【解决方案1】:

    为了序列化一个对象,您需要序列化整个对象图,即顶部对象及其引用的所有对象等等。如果您尝试序列化系统提供的对象,您可能会遇到一些无法序列化的本机(操作系统提供)对象。这就是为什么序列化系统对象几乎是不可能的。

    为了在 Android 操作系统中发送视图(例如通过 Intent),您应该使用一个特殊的类:RemoteViews

    RemoteViews不是视图,而是如何构建视图的一系列命令。您可以从 XML 布局资源创建它,对其进行操作。由于它实现了 Parcelable,您可以通过 intent.putExtra(name, remoteViews) 轻松将其添加到 Intent。

    【讨论】:

      【解决方案2】:

      你没有在 writeExternal 方法中做任何事情......

      最好(在你的情况下)使用可序列化接口而不是可外部化的 ..

      Externalizable 是一个接口,它为程序员提供了将考虑中的对象外部化的选项(因为您没有向流中写入任何内容,因此它不会传递对象)。

      如果你使用 Serializable 代替 Externalizable,事情会自动序列化并且事情会开始工作。

      【讨论】:

      • 为了序列化对象树,所有对象都需要用 Serializable 标记。 View 没有实现 Serializable。
      • 是的..这就是我建议使用Serializable 而不是Externalisable 或在writeExternalreadExternal 中编写一些实现
      • 都不行。请再次阅读我的回答和评论。
      • 您不能将 Serializable 添加到现有的系统提供的类中,在本例中为 android.widget.TableLayout。
      猜你喜欢
      • 2020-10-16
      • 2012-09-18
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 2016-08-06
      • 1970-01-01
      相关资源
      最近更新 更多