Экстернализация / Сериализация не работает? - PullRequest
0 голосов
/ 08 сентября 2011

Я пытаюсь передать объект контрольного списка по цели следующему действию.Вот код:

Объект 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.

как мне правильно передать значения?

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Чтобы сериализовать объект, вам нужно сериализовать весь граф объектов, то есть верхний объект и все объекты, на которые он ссылается, и так далее. Если вы попытаетесь сериализовать предоставленные системой объекты, вы можете столкнуться с некоторыми собственными (предоставляемыми ОС) объектами, которые нельзя сериализовать. Вот почему сериализация системных объектов в большинстве случаев невозможна.

Для отправки видов вокруг ОС Android (например, через Intent) существует специальный класс, который вы должны использовать: RemoteViews

RemoteViews - это не представление, а серия команд для создания представления. Вы можете создать его из ресурса макета XML, манипулировать им. Поскольку он реализует Parcelable, вы можете легко добавить его в Intent через intent.putExtra(name, remoteViews).

0 голосов
/ 08 сентября 2011

вы ничего не делаете в методе writeExternal ...

Лучше (в вашем случае) использовать сериализуемый интерфейс вместо внешнего. .. 1003 *

Externalizable - это интерфейс, который дает программисту возможность внешнего вида рассматриваемого объекта (поскольку вы ничего не записали в поток, так как объект не передается через него).

вместо Externalizable, если вы используете Serializable, все будет сериализовано автоматически и все заработает.

...