Circular Dependencies এর জন্য Custom Serializer

Circular References এবং Bidirectional Relationships হ্যান্ডল করা - জ্যাকসন (Jackson) - Java Technologies

287

Circular Dependency সমস্যার কারণ

Circular Dependency তখন ঘটে যখন দুটি বা তার বেশি অবজেক্ট একে অপরকে রেফারেন্স করে। উদাহরণস্বরূপ, একটি Employee ক্লাস এবং একটি Department ক্লাস যদি একে অপরকে রেফারেন্স করে, তখন Serialization-এর সময় এই রেফারেন্স একটি ইনফিনাইট লুপ তৈরি করতে পারে, যা StackOverflowError ঘটাতে পারে।


1. Circular Dependency উদাহরণ

ক্লাস: Employee এবং Department

class Department {
    private String name;
    private Employee head;

    // Constructors, Getters, and Setters
    public Department(String name, Employee head) {
        this.name = name;
        this.head = head;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Employee getHead() {
        return head;
    }

    public void setHead(Employee head) {
        this.head = head;
    }
}

class Employee {
    private String name;
    private Department department;

    // Constructors, Getters, and Setters
    public Employee(String name, Department department) {
        this.name = name;
        this.department = department;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }
}

এই উদাহরণে Employee একটি Department রেফারেন্স করে এবং Department একটি Employee রেফারেন্স করে।


2. Circular Dependency হ্যান্ডলিংয়ের পদ্ধতি

পদ্ধতি ১: @JsonIgnore ব্যবহার

যে ফিল্ডটি Circular Dependency তৈরি করছে, তা @JsonIgnore দিয়ে বাদ দেওয়া যায়।

উদাহরণ: @JsonIgnore ব্যবহার

import com.fasterxml.jackson.annotation.JsonIgnore;

class Department {
    private String name;

    @JsonIgnore
    private Employee head;

    // Constructors, Getters, and Setters
}

দোষ: এটি রেফারেন্স একেবারে বাদ দিয়ে দেয়, যা কিছু ক্ষেত্রে কার্যকর নাও হতে পারে।


পদ্ধতি ২: Custom Serializer ব্যবহার

Custom Serializer তৈরি করে নির্দিষ্ট ফিল্ড বা ডেটা স্ট্রাকচার হ্যান্ডল করা যায়।


3. Custom Serializer উদাহরণ

Custom Serializer তৈরি

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

class EmployeeSerializer extends JsonSerializer<Employee> {
    @Override
    public void serialize(Employee employee, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("name", employee.getName());
        if (employee.getDepartment() != null) {
            gen.writeStringField("department", employee.getDepartment().getName());
        }
        gen.writeEndObject();
    }
}

Serializer প্রয়োগ করা

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

class Employee {
    private String name;

    @JsonSerialize(using = EmployeeSerializer.class)
    private Department department;

    // Constructors, Getters, and Setters
}

4. Serialization এবং Deserialization

Serialization

public class CircularDependencyExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Circular Dependency তৈরি
        Employee employee = new Employee("John", null);
        Department department = new Department("HR", employee);
        employee.setDepartment(department);

        // Serialize
        String json = mapper.writeValueAsString(employee);
        System.out.println("Serialized JSON: " + json);
    }
}

আউটপুট:

{
  "name": "John",
  "department": "HR"
}

5. টিপস

  1. Bidirectional Relationships এড়িয়ে চলুন: যদি সম্ভব হয়, Circular Dependency এড়ানোর জন্য Design-এ পরিবর্তন আনুন।
  2. Custom Serializer ব্যবহার: যেখানে ফিল্ডের পুরো তথ্যের পরিবর্তে কেবল প্রয়োজনীয় তথ্য Serialize করতে হবে।
  3. Lazy Loading: যদি Circular Dependency-এর কিছু অংশ প্রয়োজন না হয়, তাহলে সেটি Lazy Load করুন।
  4. ObjectMapper Configuration: যদি @JsonIgnore বা Custom Serializer ব্যবহার না করতে চান, তাহলে ObjectMapper-এ Circular Reference Detect কনফিগার করতে পারেন:

    mapper.configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, false);
    

6. Use Cases

  • REST API Development: যখন কোনো REST API Circular Reference তৈরি করে।
  • Database Mapping: OneToMany বা ManyToOne সম্পর্কযুক্ত ডেটা Serialize করতে।
  • Complex Data Models: জটিল ডেটা মডেলকে JSON-এ রূপান্তর করার সময়।

Jackson Circular Dependency সমস্যা সমাধানের জন্য @JsonIgnore বা Custom Serializer ব্যবহার করা যায়। তবে, Custom Serializer ব্যবহার করলে আপনি ফাইন-গ্রেইনড নিয়ন্ত্রণ পাবেন, যা জটিল সম্পর্কযুক্ত ডেটা মডেল হ্যান্ডল করতে কার্যকর।

Content added By
Promotion

Are you sure to start over?

Loading...