外化/序列化不起作用?

时间:2011-09-08 18:53:27

标签: java android serialization deserialization

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

CheckList Object(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。

我怎样才能正确传递值?

2 个答案:

答案 0 :(得分:1)

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

为了在Android OS中发送视图(例如Via Intent),您应该使用一个特殊的类:RemoteViews

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

答案 1 :(得分:-2)

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

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

Externalizable是一个接口,它为程序员提供了外部考虑对象的选项(因为你没有向流写入任何东西而不是通过对象)。

如果你使用Serializable,那么

而不是Externalizable会自动序列化。事情会开始奏效。