Выполняются ли пользовательские объекты по значению или переданы по ссылке в фрагментах и ​​действиях.?

привет экспертов по Java и Android. У меня проблема. Я делаю приложение для чата на основе XMPP. Есть несколько вещей, которые меня путают.

У меня есть класс с именем Room_Structure, который реализует Serializable. Этот класс имеет объект с именем currentRoom.

Если я передаю объект currentroom между двумя фрагментами, поставив его в комплекте, он отлично работает и, на удивление, передается по ссылке. Я не знаю, почему. Он не должен вести себя так. btw Я использую библиотеку поддержки Android?

Но если я передаю объект currentRoom между действиями с использованием пакета и помещением этого пакета в намерение, я получаю сбой при каждом запуске нового действия с использованием этого намерения.

Подробнее см. здесь Код

public class Room_Structure implements Serializable {


    private static final long serialVersionUID = 1L;
    private String Rname;
    private ArrayList<Message_Pattern> msg_list;
    private MultiUserChat XmppSession;
    private boolean Background;
    private boolean Modified;
    private boolean Destroyed;
}

Вышеупомянутый класс имеет конструкторы, а также getter и seters.

Теперь вот что я делаю:

Учтите, что объект currentRoom уже заполнен, и вот как я передаю его фрагменту

    Bundle b = new Bundle();
    b.putSerializable("RoomObject", currentRoom);
    Fragment_Chat newChat = new Fragment_Chat();
    newChat.setArguments(b);
    FragmentManager fm = getChildFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.fl_chatFragment, newChat);
    ft.addToBackStack(null);
    ft.commit();

извлекает его из метода Fragment_Chat OnActivityCreated(), подобного этому

Bundle extras = getArguments();
Room_Structure recievedRoom = (Room_Structure) extras.getSerializable("RoomObject");

Теперь этот выше код работает Отлично подходит для Фрагментов. единственная проблема заключается в том, что ссылка на объект передается новому фрагменту. Это не то, как он должен себя вести. Он должен просто отправить значение не ссылкой.

Вот как я знаю, что объекты передаются по ссылке

Sending Object : [email protected]
Recieved Object: [email protected]

оба имеют одинаковые ссылки или адрес. Проверено в Отладка

Теперь я не могу воспроизвести это поведение в действиях

У меня есть Activity, который содержит ExpandibleListView. Я реализовал адаптер для этого Expandiblelistview, расширив его из BaseExpandableListAdapter. Это имя класса адаптера - Websites_ListAdapter.java. Он также передал контекст активности в своем конструкторе. И я сделал макет, который можно щелкнуть в списке. И я хочу начать работу, когда нажимаем. пожалуйста, не спрашивайте, почему я сделал это долго. Я отправляю этот объект из этого веб-сайта_ListAdapter, как этот

Intent i=new Intent(ActivityContext, ChatScreen.class);
    Bundle b = new Bundle();
    b.putSerializable("RoomObject", currentRoom);
    i.putExtras(b);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    ActivityContext.startActivity(i);

Но я получаю эту ошибку в Logcat. На этот раз, когда я вызываю ActivityContext.startActivity(i)

04-25 15:38:07.474: E/AndroidRuntime(10250): FATAL EXCEPTION: main
04-25 15:38:07.474: E/AndroidRuntime(10250): java.lang.RuntimeException: Parcelable encountered IOException writing 

serializable object (name = com.software.chat.Classes.Room_Structure)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.os.Parcel.writeSerializable(Parcel.java:1279)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.os.Parcel.writeValue(Parcel.java:1233)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.os.Parcel.writeMapInternal(Parcel.java:591)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.os.Bundle.writeToParcel(Bundle.java:1619)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.os.Parcel.writeBundle(Parcel.java:605)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.content.Intent.writeToParcel(Intent.java:6814)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.app.ActivityManagerProxy.startActivity

(ActivityManagerNative.java:1910)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1415)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.app.Activity.startActivityForResult(Activity.java:3446)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.app.Activity.startActivityForResult(Activity.java:3407)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.support.v4.app.FragmentActivity.startActivityForResult

(FragmentActivity.java:817)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.app.Activity.startActivity(Activity.java:3617)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.app.Activity.startActivity(Activity.java:3585)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at com.software.chat.Adapters.Websites_ListAdapter$1.onClick

(Websites_ListAdapter.java:211)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.view.View.performClick(View.java:4211)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.view.View$PerformClick.run(View.java:17267)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.os.Handler.handleCallback(Handler.java:615)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.os.Looper.loop(Looper.java:137)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.app.ActivityThread.main(ActivityThread.java:4898)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.lang.reflect.Method.invokeNative(Native Method)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.lang.reflect.Method.invoke(Method.java:511)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run

(ZygoteInit.java:1006)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at dalvik.system.NativeStart.main(Native Method)
04-25 15:38:07.474: E/AndroidRuntime(10250): Caused by: java.io.NotSerializableException: 

org.jivesoftware.smackx.muc.MultiUserChat
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.io.ObjectOutputStream.writeObjectInternal

(ObjectOutputStream.java:1671)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.io.ObjectOutputStream.defaultWriteObject

(ObjectOutputStream.java:368)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.io.ObjectOutputStream.writeObjectInternal

(ObjectOutputStream.java:1671)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
04-25 15:38:07.474: E/AndroidRuntime(10250):    at android.os.Parcel.writeSerializable(Parcel.java:1274)
04-25 15:38:07.474: E/AndroidRuntime(10250):    ... 24 more

Я знаю, что есть много способов передать объекты между действиями, но я хочу знать, почему это происходит так и что делает сериализуемое в фоновом режиме?

Любая помощь по этому вопросу очень ценится.

Ответ 1

Разница в том, что вы не создаете объект активности, как вы делаете с фрагментами, вы просите систему сделать это. Вы создаете намерение, чтобы попросить систему создать активность, каждая вещь в намерении сериализуется, а затем передается через систему в новое действие. Невозможно создать два действия одновременно с одним и тем же объектом. Если вам действительно нужна эта же ссылка на объект, вы всегда можете создать синглтон.

Ответ 2

Если вы заглянете в источники Bundle, вы увидите, что он использует карту для хранения объектов и будет сериализовывать объекты только при Bundle сам сериализуется.

Кажется, что Bundle не сериализуется при передаче фрагментам. Это может быть трюк оптимизации или "ошибка" реализации.

Но когда вы хотите начать новую деятельность, пакет будет сериализован и десериализован. Вот почему у вас есть это исключение только для Деяний.

Ответ 3

Проблема здесь:

Caused by: java.io.NotSerializableException: 

org.jivesoftware.smackx.muc.MultiUserChat

Ответ:

public Class MultiUserChat implements Serializable