TypeScript में ऑब्जेक्ट्स का सीरियलाइज़ेशन: JSON से protobuf तक
सीरियलाइज़ेशन डेटा की एक जटिल संरचना (ऑब्जेक्ट, ऐरे, क्लास इंस्टेंस) को स्टोरेज या नेटवर्क पर ट्रांसमिशन के लिए उपयुक्त फॉर्मेट में बदलने की प्रक्रिया है। विपरीत प्रक्रिया — डीसीरियलाइज़ेशन — इस फॉर्मेट से ऑब्जेक्ट को पुनर्स्थापित करती है। TypeScript में, जो JavaScript का एक सख्ती से टाइप किया गया सुपरसेट है, सीरियलाइज़ेशन विशेष महत्व रखता है: केवल डेटा ट्रांसफर करना ही नहीं, बल्कि टाइप्स, मेथड्स और क्लासेज़ की संरचना को बनाए रखना भी महत्वपूर्ण है।
इस लेख में, हम TypeScript में ऑब्जेक्ट्स के सीरियलाइज़ेशन के लिए मुख्य दृष्टिकोण और टूल्स पर विचार करेंगे, बिल्ट-इन सुविधाओं से लेकर विशेष लाइब्रेरीज़ तक।
1. नेटिव सीरियलाइज़ेशन: JSON.stringify और JSON.parse
सबसे सरल और सामान्य तरीका बिल्ट-इन मेथड्स JSON.stringify() और JSON.parse() का उपयोग करना है। हालांकि, इस दृष्टिकोण की सीमाएँ हैं:
- फंक्शन,
undefined,Symbol,BigInt(पुराने वर्जन में) सीरियलाइज़ नहीं होते। - ऑब्जेक्ट का प्रोटोटाइप संरक्षित नहीं रहता — डीसीरियलाइज़ेशन पर आपको एक सामान्य ऑब्जेक्ट मिलेगा, क्लास इंस्टेंस नहीं।
- साइक्लिक रेफरेंस एरर उत्पन्न करते हैं।
// सरल सीरियलाइज़ेशन का उदाहरणinterface User { id: number; name: string; email: string;}
const user: User = { id: 1, name: "इवान", email: "ivan@example.com"};
const jsonString = JSON.stringify(user);console.log(jsonString); // {"id":1,"name":"इवान","email":"ivan@example.com"}
const parsedUser: User = JSON.parse(jsonString);console.log(parsedUser.name); // इवानसरल डेटा के लिए यह पर्याप्त है, लेकिन यदि आपको क्लासेज़ के साथ काम करना है, तो अधिक उन्नत समाधान की आवश्यकता होगी।
2. toJSON और fromJSON मेथड्स के साथ कस्टम सीरियलाइज़ेशन
TypeScript (और JavaScript) आपको क्लास में toJSON() मेथड परिभाषित करने की अनुमति देता है, जो JSON.stringify के माध्यम से सीरियलाइज़ेशन के दौरान कॉल किया जाएगा। डीसीरियलाइज़ेशन के लिए, आप एक स्टैटिक मेथड fromJSON बना सकते हैं।
class Person { constructor( public firstName: string, public lastName: string, public age: number ) {}
// सीरियलाइज़ेशन के लिए मेथड toJSON() { return { fullName: `${this.firstName} ${this.lastName}`, age: this.age }; }
// डीसीरियलाइज़ेशन के लिए स्टैटिक मेथड static fromJSON(json: any): Person { const [firstName, lastName] = json.fullName.split(' '); return new Person(firstName, lastName, json.age); }}
const person = new Person("अन्ना", "पेट्रोवा", 30);const json = JSON.stringify(person);console.log(json); // {"fullName":"अन्ना पेट्रोवा","age":30}
const restoredPerson = Person.fromJSON(JSON.parse(json));console.log(restoredPerson.firstName); // अन्नायह दृष्टिकोण पूर्ण नियंत्रण देता है, लेकिन प्रत्येक क्लास के लिए बॉयलरप्लेट कोड लिखने की आवश्यकता होती है।
3. class-transformer लाइब्रेरी
class-transformer TypeScript में सीरियलाइज़ेशन/डीसीरियलाइज़ेशन के लिए सबसे लोकप्रिय लाइब्रेरीज़ में से एक है। यह डेकोरेटर्स का उपयोग करके सामान्य ऑब्जेक्ट्स को क्लास इंस्टेंसेज़ में और वापस बदलने की अनुमति देती है।
इंस्टॉलेशन:
npm install class-transformer reflect-metadataउपयोग का उदाहरण:
import { plainToClass, classToPlain, Expose, Transform } from "class-transformer";import "reflect-metadata";
class Product { @Expose() id: number;
@Expose() name: string;
@Expose() @Transform(({ value }) => value.toUpperCase()) // कस्टम ट्रांसफॉर्मेशन category: string;
@Expose({ name: "price_with_tax" }) // फील्ड का नाम बदलना price: number;
constructor(id: number, name: string, category: string, price: number) { this.id = id; this.name = name; this.category = category; this.price = price; }
getInfo(): string { return `${this.name} (${th