การทำความเข้าใจ Serialization ใน Android
Serialization เป็นกระบวนการแปลงสถานะของออบเจ็กต์ให้กลายเป็น Byte Stream ซึ่งเป็นข้อมูลที่ไม่ขึ้นกับแพลตฟอร์ม ทำให้สามารถส่งผ่าน Intent ระหว่าง Activity ได้ ใน Java เราจะใช้ interface java.io.Serializable ซึ่งเป็น Marker Interface (ไม่มีเมธอด) เพื่อบอกให้ JVM รู้ว่าคลาสนี้สามารถทำ Serialization ได้
ตัวอย่างการส่งออบเจ็กต์ระหว่าง 2 Activity
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
เปิด Android Studio → File → New Project → กรอกข้อมูลที่จำเป็น → Finish
ขั้นตอนที่ 2: ออกแบบ Layout (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="ป้อนชื่อ"
android:inputType="text" />
<EditText
android:id="@+id/phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="ป้อนเบอร์โทรศัพท์"
android:inputType="number"/>
<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ส่งข้อมูล" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
ขั้นตอนที่ 3: สร้างคลาส Model (Userinfo.java)
คลาสนี้ต้อง implements Serializable เพื่อให้สามารถส่งผ่าน Bundle ได้
import java.io.Serializable;
public class Userinfo implements Serializable {
private String name;
private String phone;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getPhone() { return phone; }
public void setPhone(String phone) { this.phone = phone; }
}
ขั้นตอนที่ 4: MainActivity.java - ส่งข้อมูล
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private EditText nameEditText, phoneEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nameEditText = findViewById(R.id.name);
phoneEditText = findViewById(R.id.phone);
Button sendBtn = findViewById(R.id.send);
sendBtn.setOnClickListener(v -> {
String name = nameEditText.getText().toString().trim();
String phone = phoneEditText.getText().toString().trim();
if (TextUtils.isEmpty(name) && TextUtils.isEmpty(phone)) {
Toast.makeText(this, "กรุณากรอกข้อมูลให้ครบถ้วน", Toast.LENGTH_LONG).show();
} else {
sendUserData(name, phone);
}
});
}
private void sendUserData(String username, String userPhone) {
Userinfo userinfo = new Userinfo();
userinfo.setName(username);
userinfo.setPhone(userPhone);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("user_data", userinfo); // key ต้องตรงกัน
intent.putExtras(bundle);
startActivity(intent);
}
}
ขั้นตอนที่ 5: SecondActivity.java - รับข้อมูล
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class SecondActivity extends AppCompatActivity {
private TextView dataTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
dataTextView = findViewById(R.id.data);
// รับข้อมูลจาก Intent
Userinfo userinfo = (Userinfo) getIntent().getSerializableExtra("user_data");
if (userinfo != null) {
String name = userinfo.getName();
String phone = userinfo.getPhone();
dataTextView.setText("ชื่อ: " + name + "\nเบอร์โทร: " + phone);
}
}
@Override
protected void onPause() {
super.onPause();
// ล้าง reference เพื่อป้องกัน memory leak
dataTextView = null;
}
}
ขั้นตอนที่ 6: Layout ของ SecondActivity (activity_second.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp" />
</LinearLayout>
หมายเหตุสำคัญ
- Key ต้องตรงกัน: key ที่ใช้ใน
putSerializable()และgetSerializableExtra()ต้องเหมือนกันทุกประการ - Performance: Serializable ใช้ Reflection ทำงานช้ากว่า Parcelable เหมาะสำหรับข้อมูลเล็กน้อย
- serialVersionUID: ควรเพิ่ม
private static final long serialVersionUID = 1L;ในคลาส Model เพื่อความปลอดภัยเวลาเวอร์ชันเปลี่ยน - Android 12+: ต้องระบุ
android:exportedใน Manifest สำหรับ Activity ที่รับ Intent
การทดสอบ
รันแอปบนอุปกรณ์จริงหรือ Emulator → กรอกชื่อและเบอร์โทร → กดปุ่ม "ส่งข้อมูล" → จะไปหน้า SecondActivity และแสดงข้อมูลที่ส่งมา