Gson এ TypeAdapterFactory একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে custom TypeAdapters তৈরি করার এবং বিভিন্ন ধরনের Java Object বা Custom Types এর জন্য তাদের ব্যবহার করার সুযোগ দেয়। TypeAdapterFactory এর মাধ্যমে আপনি generic types এবং complex object structures এর জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন লজিক লিখতে পারেন, এবং এটি TypeAdapter এর একটি ফ্যাক্টরি প্যাটার্ন হিসেবে কাজ করে। এই পদ্ধতিটি কাস্টমাইজড ডেটা ফরম্যাট, generic types, অথবা নেস্টেড অবজেক্ট টাইপগুলির জন্য উপযোগী।
TypeAdapter এবং TypeAdapterFactory এর মধ্যে পার্থক্য:
- TypeAdapter: একক টেকনিকাল ক্লাস বা object type এর জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন।
- TypeAdapterFactory: একাধিক ধরনের TypeAdapter তৈরির জন্য একটি ফ্যাক্টরি। এটি একাধিক ডেটা টাইপের জন্য একই TypeAdapter-কে অ্যাপ্লাই করার সুবিধা দেয়।
TypeAdapterFactory এর ব্যবহার
TypeAdapterFactory মূলত একাধিক টাইপের জন্য TypeAdapter তৈরি করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, যদি আপনি Date এবং LocalDateTime এর জন্য কাস্টম সিরিয়ালাইজার এবং ডেসেরিয়ালাইজার তৈরি করতে চান, তবে আপনি TypeAdapterFactory ব্যবহার করতে পারেন।
উদাহরণ: TypeAdapterFactory ব্যবহার করে কাস্টম TypeAdapter তৈরি করা
ধরা যাক, আমাদের একটি কাস্টম Date ফরম্যাট আছে এবং আমরা এটি কাস্টম TypeAdapter এর মাধ্যমে Date এবং LocalDateTime ফিল্ডে প্রয়োগ করতে চাই।
১. Custom TypeAdapter তৈরি করা
প্রথমে, আমরা Date এবং LocalDateTime এর জন্য কাস্টম TypeAdapter তৈরি করব।
import com.google.gson.*;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(new DateTypeAdapterFactory()) // Register custom TypeAdapterFactory
.create();
// JSON serialization
MyClass myObject = new MyClass(new Date(), LocalDateTime.now());
String json = gson.toJson(myObject);
System.out.println(json); // Output: {"date":"2024-12-19","localDateTime":"2024-12-19T12:34:56"}
// JSON deserialization
String jsonInput = "{\"date\":\"2024-12-19\",\"localDateTime\":\"2024-12-19T12:34:56\"}";
MyClass deserializedObject = gson.fromJson(jsonInput, MyClass.class);
System.out.println(deserializedObject.date); // Output: 2024-12-19
System.out.println(deserializedObject.localDateTime); // Output: 2024-12-19T12:34:56
}
}
class MyClass {
Date date;
LocalDateTime localDateTime;
public MyClass(Date date, LocalDateTime localDateTime) {
this.date = date;
this.localDateTime = localDateTime;
}
}
class DateTypeAdapterFactory implements TypeAdapterFactory {
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
// Check if the type is Date or LocalDateTime and return the appropriate TypeAdapter
if (type.getRawType() == Date.class) {
return (TypeAdapter<T>) new DateTypeAdapter();
}
if (type.getRawType() == LocalDateTime.class) {
return (TypeAdapter<T>) new LocalDateTimeTypeAdapter();
}
return null; // Return null for types that do not require custom serialization/deserialization
}
}
class DateTypeAdapter extends TypeAdapter<Date> {
private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
@Override
public void write(JsonWriter out, Date value) throws IOException {
out.value(format.format(value)); // Serialize Date to "yyyy-MM-dd" format
}
@Override
public Date read(JsonReader in) throws IOException {
try {
return format.parse(in.nextString()); // Deserialize string to Date
} catch (Exception e) {
throw new JsonParseException(e);
}
}
}
class LocalDateTimeTypeAdapter extends TypeAdapter<LocalDateTime> {
private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
@Override
public void write(JsonWriter out, LocalDateTime value) throws IOException {
out.value(value.format(formatter)); // Serialize LocalDateTime to "yyyy-MM-dd'T'HH:mm:ss"
}
@Override
public LocalDateTime read(JsonReader in) throws IOException {
return LocalDateTime.parse(in.nextString(), formatter); // Deserialize string to LocalDateTime
}
}
কোডের ব্যাখ্যা:
- MyClass ক্লাসে Date এবং LocalDateTime টাইপের ফিল্ড রয়েছে।
- DateTypeAdapterFactory একটি কাস্টম TypeAdapterFactory যা
DateএবংLocalDateTimeএর জন্য যথাক্রমে কাস্টম TypeAdapter প্রদান করে। - DateTypeAdapter এবং LocalDateTimeTypeAdapter সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন লজিক বাস্তবায়ন করে। Date কে
"yyyy-MM-dd"ফরম্যাটে এবং LocalDateTime কে"yyyy-MM-dd'T'HH:mm:ss"ফরম্যাটে সিরিয়ালাইজ ও ডেসেরিয়ালাইজ করা হচ্ছে।
কাস্টম TypeAdapterFactory এর সুবিধা:
- Reusable: একাধিক টাইপের জন্য একই ধরনের TypeAdapter রেজিস্টার করা যায়।
- Flexible: আপনি যে কোনও টাইপের জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন লজিক প্রয়োগ করতে পারেন।
- Generic Types: TypeAdapterFactory ব্যবহার করে আপনি generic types এবং parameterized types এর জন্য TypeAdapter তৈরি করতে পারেন।
উদাহরণ: Generic TypeAdapterFactory
ধরা যাক, আপনার কাছে এমন একটি generic class রয়েছে যার জন্য আপনি TypeAdapter তৈরি করতে চান:
class Box<T> {
T value;
public Box(T value) {
this.value = value;
}
}
class GenericTypeAdapterFactory implements TypeAdapterFactory {
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (type.getRawType() == Box.class) {
TypeAdapter<Object> elementAdapter = gson.getAdapter(Object.class); // Use a default adapter for T
return new TypeAdapter<T>() {
@Override
public void write(JsonWriter out, T value) throws IOException {
out.beginObject();
out.name("value");
elementAdapter.write(out, ((Box<?>) value).value); // Serialize value inside Box
out.endObject();
}
@Override
public T read(JsonReader in) throws IOException {
in.beginObject();
in.nextName(); // Skip the "value" field name
Object value = elementAdapter.read(in); // Deserialize the value inside Box
in.endObject();
return (T) new Box<>(value);
}
};
}
return null;
}
}
এখানে GenericTypeAdapterFactory একটি Box ক্লাসের জন্য কাস্টম TypeAdapter তৈরি করে যা Box এর ভ্যালু T সিরিয়ালাইজ এবং ডেসেরিয়ালাইজ করবে।
- TypeAdapterFactory Gson-এ কাস্টম TypeAdapter তৈরি করার এবং একাধিক টাইপে প্রয়োগ করার জন্য একটি শক্তিশালী উপায়।
- এটি generic types এবং complex object structures এর জন্য অত্যন্ত কার্যকর, যেখানে বিভিন্ন টাইপের জন্য একাধিক TypeAdapter প্রয়োজন।
- TypeAdapterFactory এর মাধ্যমে আপনি Date, LocalDateTime, Box এবং অন্যান্য কাস্টম টাইপের জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন কাস্টমাইজ করতে পারেন।
Read more