हमें सीरियल इंटरफ़ेस कब लागू करना चाहिए?


153
public class Contact implements Serializable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  1. मुझे Serializableइंटरफ़ेस कब लागू करना चाहिए ?
  2. हम ये क्यों करते हैं?
  3. क्या यह कोई लाभ या सुरक्षा देता है?

1
FYI यहाँ स्वीकृत उत्तर अधूरा और भ्रामक है, क्योंकि यह सुरक्षा कमियों को संबोधित नहीं करता है। प्रभावी जावा देखें , आइटम 86: महान सावधानी के साथ सीरियल को लागू करना। रायडवल्ड ने यहां कहा कि क्रमबद्धता का उपयोग नहीं करना सही है।
नाथन ह्यूजेस

जवाबों:


157
  1. इस "सीरियलाइज़ेशन" से क्या बात है? :

    यह आपको ऑब्जेक्ट या ऑब्जेक्ट का समूह लेने देता है, उन्हें एक डिस्क पर रखता है या उन्हें तार या वायरलेस ट्रांसपोर्ट मैकेनिज्म के माध्यम से भेजता है, फिर बाद में, शायद दूसरे कंप्यूटर पर, प्रक्रिया को उल्टा कर देता है: मूल ऑब्जेक्ट (ओं) को फिर से जीवित करें। बुनियादी तंत्र वस्तु (ओं) को बिट्स की एक आयामी धारा में समतल करने के लिए हैं, और बिट्स की उस धारा को मूल वस्तु (ओं) में वापस मोड़ना है।

    स्टार ट्रेक पर ट्रांसपोर्टर की तरह, यह सब कुछ जटिल लेने और 1 एस और 0 एस के एक फ्लैट अनुक्रम में बदलने के बारे में है, फिर 1 एस और 0 एस के अनुक्रम (संभवतः एक और स्थान पर, संभवतः एक और समय पर) ले रहा है और मूल जटिल का पुनर्निर्माण कर रहा है। कुछ कुछ।"

    इसलिए, Serializableजब आप ऑब्जेक्ट की एक प्रति संग्रहीत करने की आवश्यकता हो , तो इंटरफ़ेस को लागू करें , उन्हें एक और प्रक्रिया पर भेजें जो उसी सिस्टम या नेटवर्क पर चलती है।

  2. क्योंकि आप किसी ऑब्जेक्ट को स्टोर या भेजना चाहते हैं।

  3. यह वस्तुओं को संग्रहीत करना और भेजना आसान बनाता है। इसका सुरक्षा से कोई लेना-देना नहीं है।


4
क्या यह सभी डोमेन मॉडल के लिए सीरियलाइज़बल इंटरफ़ेस को लागू करने के लिए सबसे अच्छा अभ्यास है ...
द जावा

8
@theJava यह सर्वोत्तम प्रथाओं का सवाल नहीं है। यह सवाल है कि आपको बाइट्स की श्रृंखला की आवश्यकता है या नहीं।
मोइनुद्दीन

5
JSON का उपयोग करते समय आपको इस इंटरफ़ेस को लागू करने की आवश्यकता नहीं है और बस उस स्ट्रिंग को भेज सकते हैं .. इसलिए Im अभी भी सुनिश्चित नहीं है कि जब आप JSON का उपयोग कर सकते हैं तो इस इंटरफ़ेस का उपयोग क्यों करें।
योनातन नीर

1
@YonatanNir मुझे यकीन नहीं है कि एक JSON का उपयोग क्यों करेगा जब MsgPack, Avro, Thrift, या Protobuf IO हस्तांतरण के लिए बेहतर हैं।
OneCricketeer

1
@YonatanNir एक बेहतर परिभाषित स्कीमा बेहतर है। JSON का अर्थ मानव पठनीय है, जबकि बाइनरी एन्कोडेड प्रारूप तार पर कहीं अधिक कुशल हैं
OneCricketeer

48
  1. Serializableजब आप किसी वर्ग के उदाहरण को बाइट्स की श्रृंखला में बदलने में सक्षम होना चाहते हैं या जब आपको लगता है कि कोई Serializableवस्तु आपके वर्ग की आवृत्ति का संदर्भ दे सकती है , तो इंटरफ़ेस को लागू करें ।

  2. Serializable कक्षाएं तब उपयोगी होती हैं जब आप उनमें से उदाहरणों को जारी रखना चाहते हैं या उन्हें तार पर भेजना चाहते हैं।

  3. Serializableकक्षाओं के उदाहरण आसानी से प्रेषित किए जा सकते हैं। हालाँकि, सीरियलाइज़ेशन के कुछ सुरक्षा परिणाम हैं। जोशुआ बलोच का प्रभावी जावा पढ़ें ।


32

इस सवाल का जवाब, शायद आश्चर्यजनक रूप से, कभी नहीं , या अधिक वास्तविक रूप से, केवल जब आपको कानूनी तौर पर कोड के साथ अंतर के लिए मजबूर किया जाता है । जोशुआ बलोच द्वारा प्रभावी जावा, तीसरे संस्करण में यह सिफारिश की गई है:

आपके द्वारा लिखी गई किसी भी नई प्रणाली में जावा क्रमांकन का उपयोग करने का कोई कारण नहीं है

ओरेकल के मुख्य वास्तुकार, मार्क रेनहोल्ड, रिकॉर्ड पर कहते हैं कि वर्तमान जावा क्रमांकन तंत्र को हटाना एक दीर्घकालिक लक्ष्य है।


जावा क्रमांकन त्रुटिपूर्ण क्यों है

जावा भाषा का एक भाग प्रदान करता है जो एक सीरियलाइज़ेशन स्कीम है जिसे आप Serializableइंटरफेस का उपयोग करके चुन सकते हैं । इस योजना में कई असाध्य दोष हैं और इसे जावा भाषा डिजाइनरों द्वारा एक असफल प्रयोग के रूप में माना जाना चाहिए।

  • यह मौलिक रूप से दिखावा करता है कि व्यक्ति किसी वस्तु के क्रमबद्ध रूप के बारे में बात कर सकता है । लेकिन असीम रूप से कई क्रमबद्ध योजनाएं हैं, जिसके परिणामस्वरूप असीम रूप से कई धारावाहिक रूप हैं। एक योजना को लागू करने से, योजना को बदलने के किसी भी तरीके के बिना, आवेदन उनके लिए सबसे उपयुक्त एक योजना का उपयोग नहीं कर सकते हैं।
  • यह वस्तुओं के निर्माण के एक अतिरिक्त साधन के रूप में कार्यान्वित किया जाता है, जो किसी भी पूर्व शर्त को बायपास करता है जो आपके निर्माता या कारखाने के तरीकों का प्रदर्शन करते हैं। जब तक मुश्किल, त्रुटि प्रवण, और अतिरिक्त deserialization कोड का परीक्षण करने के लिए मुश्किल नहीं लिखा जाता है, आपके कोड में संभवतः एक सुरक्षा सुरक्षा कमजोरी है।
  • धारावाहिक रूप के विभिन्न संस्करणों की परीक्षण अंतर बहुत मुश्किल है।
  • अपरिवर्तनीय वस्तुओं को संभालना कष्टकारी है।

इसके बजाय क्या करें

इसके बजाय, एक क्रमांकन योजना का उपयोग करें जिसे आप स्पष्ट रूप से नियंत्रित कर सकते हैं। जैसे प्रोटोकॉल बफ़र्स, JSON, XML या आपकी स्वयं की कस्टम योजना।


2
उस स्तर के एक विशेषज्ञ के बहुत नहीं, लेकिन लगता है कि आपको एक बिंदु मिला है।
रात्रि विश्राम

1
मुझे लगता है कि यह सबसे अच्छा जवाब है!
jancanczur
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.