Gson-এ Complex Object Serialization করার জন্য TypeAdapter একটি শক্তিশালী উপায়। TypeAdapter আপনাকে কাস্টম Serialization এবং Deserialization আচরণ তৈরি করতে দেয়, যখন আপনার Object গুলি জটিল (complex) হতে পারে এবং আপনি তাদের কাস্টম ফরম্যাটে JSON এ রূপান্তর করতে চান।
TypeAdapter ব্যবহার করে আপনি একটি জাভা অবজেক্টকে JSON এ রূপান্তর (serialize) এবং JSON থেকে জাভা অবজেক্টে রূপান্তর (deserialize) কাস্টমাইজ করতে পারেন। এটি JsonSerializer এবং JsonDeserializer এর চেয়ে অনেক বেশি নিয়ন্ত্রণ এবং নমনীয়তা প্রদান করে।
1. TypeAdapter ব্যবহার করার উদাহরণ
ধরা যাক, আমাদের একটি Complex Object রয়েছে, যেটি একটি Person এবং তার Address এর সাথে সম্পর্কিত। আমরা এই অবজেক্টগুলোর জন্য কাস্টম Serialization এবং Deserialization করতে চাই।
1.1 Complex Object তৈরি
class Address {
private String street;
private String city;
public Address(String street, String city) {
this.street = street;
this.city = city;
}
public String getStreet() {
return street;
}
public String getCity() {
return city;
}
}
class Person {
private String name;
private int age;
private Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public Address getAddress() {
return address;
}
}
2. TypeAdapter তৈরি করা
TypeAdapter তৈরি করতে, আমাদের Person এবং Address ক্লাসের জন্য কাস্টম Serialization এবং Deserialization তৈরি করতে হবে।
2.1 Person এবং Address এর জন্য TypeAdapter তৈরি
import com.google.gson.*;
import java.lang.reflect.Type;
class AddressTypeAdapter extends TypeAdapter<Address> {
@Override
public void write(JsonWriter out, Address address) throws IOException {
out.beginObject();
out.name("street").value(address.getStreet());
out.name("city").value(address.getCity());
out.endObject();
}
@Override
public Address read(JsonReader in) throws IOException {
String street = null;
String city = null;
in.beginObject();
while (in.hasNext()) {
String name = in.nextName();
if (name.equals("street")) {
street = in.nextString();
} else if (name.equals("city")) {
city = in.nextString();
}
}
in.endObject();
return new Address(street, city);
}
}
class PersonTypeAdapter extends TypeAdapter<Person> {
@Override
public void write(JsonWriter out, Person person) throws IOException {
out.beginObject();
out.name("name").value(person.getName());
out.name("age").value(person.getAge());
// Serialize Address using the custom AddressTypeAdapter
AddressTypeAdapter addressAdapter = new AddressTypeAdapter();
out.name("address");
addressAdapter.write(out, person.getAddress());
out.endObject();
}
@Override
public Person read(JsonReader in) throws IOException {
String name = null;
int age = 0;
Address address = null;
in.beginObject();
while (in.hasNext()) {
String fieldName = in.nextName();
if (fieldName.equals("name")) {
name = in.nextString();
} else if (fieldName.equals("age")) {
age = in.nextInt();
} else if (fieldName.equals("address")) {
AddressTypeAdapter addressAdapter = new AddressTypeAdapter();
address = addressAdapter.read(in);
}
}
in.endObject();
return new Person(name, age, address);
}
}
3. TypeAdapter কে GsonBuilder-এ নিবন্ধন (Registering the TypeAdapter)
এখন আমরা TypeAdapter গুলিকে GsonBuilder-এ নিবন্ধন (register) করবো, যাতে Gson-এ তাদের ব্যবহার করা যায়।
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class Main {
public static void main(String[] args) {
// একটি Person অবজেক্ট তৈরি
Address address = new Address("123 Main St", "New York");
Person person = new Person("John Doe", 30, address);
// GsonBuilder ব্যবহার করে TypeAdapter নিবন্ধন
Gson gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonTypeAdapter())
.registerTypeAdapter(Address.class, new AddressTypeAdapter())
.create();
// Serialize Person অবজেক্ট
String json = gson.toJson(person);
System.out.println("Serialized JSON: " + json);
// Deserialize JSON থেকে Person অবজেক্ট
Person deserializedPerson = gson.fromJson(json, Person.class);
System.out.println("Deserialized Person: " + deserializedPerson.getName());
System.out.println("Deserialized Address: " + deserializedPerson.getAddress().getStreet());
}
}
আউটপুট:
Serialized JSON: {"name":"John Doe","age":30,"address":{"street":"123 Main St","city":"New York"}}
Deserialized Person: John Doe
Deserialized Address: 123 Main St
4. কাস্টম TypeAdapter দিয়ে বিভিন্ন Complex Objects Serialize এবং Deserialize করা
এভাবে TypeAdapter ব্যবহার করে আপনি Complex Objects কাস্টমভাবে serialize এবং deserialize করতে পারেন। এর সুবিধাগুলো হলো:
- কাস্টম ফরম্যাট: আপনি JSON এ অবজেক্টের কোন তথ্য কিভাবে প্রদর্শিত হবে তা কাস্টমাইজ করতে পারবেন।
- Nested Objects: Nested অবজেক্টগুলোকে কাস্টমভাবে Serialize এবং Deserialize করা সম্ভব।
- বিশেষ ফরম্যাটিং: Date, Time, Enum বা অন্যান্য কমপ্লেক্স ডেটা টাইপের জন্য কাস্টম ফরম্যাটিং করতে পারবেন।
5. TypeAdapter এর অন্যান্য ব্যবহার:
- Null Handling: TypeAdapter ব্যবহার করে আপনি
nullমানের জন্য কাস্টম আচরণ তৈরি করতে পারেন, যেমনnullভ্যালু না পাঠানো। - Custom Field Exclusion: আপনার JSON ডেটা থেকে বিশেষ কিছু ফিল্ড বাদ দেওয়া বা পরবর্তীতে এক্সক্লুড করা।
সারাংশ:
TypeAdapterএকটি কাস্টমSerialization এবং Deserialization এর জন্য কার্যকরী উপায়, যা জটিল (complex) অবজেক্ট গুলিকে JSON এ কাস্টম ফরম্যাটে রূপান্ত
র করতে সাহায্য করে।
- এটি nested objects, custom fields, এবং complex data types যেমন
Date,Enumইত্যাদির জন্য কাস্টম পদ্ধতি ব্যবহার করতে সক্ষম। - TypeAdapter আপনাকে JSON রিড এবং রাইট করার সময়ে পুরো ফ্লেক্সিবিলিটি দেয়, যেখানে আপনি JSON ফরম্যাট কাস্টমাইজ করতে পারেন।
এভাবে, TypeAdapter ব্যবহার করে আপনি যে কোন ধরনের complex object কে কাস্টম JSON ফরম্যাটে serialize এবং deserialize করতে পারেন।
Read more