Android: Parcelable और Serializable के बीच अंतर?


313

एंड्रॉइड वस्तुओं को क्रमबद्ध करने के लिए 2 इंटरफेस क्यों प्रदान करता है? क्या सीरियल योग्य वस्तुएं एंड्रॉइड Binderऔर एआईडीएल फाइलों के साथ हस्तक्षेप करती हैं ?

जवाबों:


444

एंड्रॉइड में हम वस्तुओं को सिर्फ गतिविधियों के लिए पास नहीं कर सकते। ऐसा करने के लिए वस्तुओं को या तो लागू करना चाहिए Serializableया Parcelableइंटरफ़ेस।

serializable

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

नीचे दिए गए उदाहरण को देखें (सीरियल करने योग्य):

// MyObjects Serializable class

import java.io.Serializable;
import java.util.ArrayList;
import java.util.TreeMap;

import android.os.Parcel;
import android.os.Parcelable;

public class MyObjects implements Serializable {

    private String name;
    private int age;
    public ArrayList<String> address;

    public MyObjects(String name, int age, ArrayList<String> address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public ArrayList<String> getAddress() {
        if (!(address == null))
            return address;
        else
            return new ArrayList<String>();
    }

    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }
}
// MyObjects instance
MyObjects mObjects = new MyObjects("name", "age", "Address array here");

// Passing MyObjects instance via intent
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects)    mIntent.getSerializableExtra("UniqueKey");

Parcelable

Parcelableकी तुलना में प्रक्रिया बहुत तेज है Serializable। इसका एक कारण यह है कि हम इसे अनुमान लगाने के लिए प्रतिबिंब का उपयोग करने के बजाय क्रमांकन प्रक्रिया के बारे में स्पष्ट हो रहे हैं। यह इस कारण से भी है कि इस उद्देश्य के लिए कोड को भारी रूप से अनुकूलित किया गया है।

नीचे दिए गए उदाहरण को देखें (Parcelable):

// MyObjects Parcelable class

import java.util.ArrayList;

import android.os.Parcel;
import android.os.Parcelable;

public class MyObjects implements Parcelable {

    private int age;
    private String name;
    private ArrayList<String> address;

    public MyObjects(String name, int age, ArrayList<String> address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public MyObjects(Parcel source) {
        age = source.readInt();
        name = source.readString();
        address = source.createStringArrayList();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(age);
        dest.writeString(name);
        dest.writeStringList(address);
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public ArrayList<String> getAddress() {
        if (!(address == null))
            return address;
        else
            return new ArrayList<String>();
    }

    public static final Creator<MyObjects> CREATOR = new Creator<MyObjects>() {
        @Override
        public MyObjects[] newArray(int size) {
            return new MyObjects[size];
        }

        @Override
        public MyObjects createFromParcel(Parcel source) {
            return new MyObjects(source);
        }
    };
}
// MyObjects instance
MyObjects mObjects = new MyObjects("name", "age", "Address array here");

// Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects) mIntent.getParcelableExtra("UniqueKey");

आप ArrayListनीचे के रूप में पार्सलेबल ऑब्जेक्ट पास कर सकते हैं:

// Array of MyObjects
ArrayList<MyObjects> mUsers;

// Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putParcelableArrayListExtra("UniqueKey", mUsers);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
ArrayList<MyObjects> mUsers = mIntent.getParcelableArrayList("UniqueKey");

निष्कर्ष

  1. ParcelableSerializableइंटरफ़ेस से तेज है
  2. Parcelableइंटरफ़ेस की तुलना में लागू करने के लिए Serializableइंटरफ़ेस अधिक समय लेता है
  3. Serializable इंटरफ़ेस को लागू करना आसान है
  4. Serializable इंटरफ़ेस बहुत सारी अस्थायी वस्तुएँ बनाता है और काफी कचरा संग्रह का कारण बनता है
  5. Parcelable सरणी को Android में Intent के माध्यम से पारित किया जा सकता है

2
@ क्या आप प्रतिबिंब से क्या मतलब है प्रयोग किया जाता है ? प्रतिबिंब क्या है ?
AV

11
@AbhinavVutukuri परावर्तन Object.getClass () और इस तरह रन-टाइम पर ऑब्जेक्ट्स, फ़ील्ड्स और विधियों का निरीक्षण करने के लिए शब्द है।
१०:

2
धारावाहिक डेटा को बनाए रखने के लिए बेहतर हैं, दूसरी ओर पार्सलेबल ऑब्जेक्ट्स को बनाए नहीं रखना चाहिए। यह एक बहुत बुरा अभ्यास है
TheAnimatrix

2
@Sujith जैसा कि एक से अधिक लोगों ने कहा है, पार्सलेबल ऑब्जेक्ट्स को स्थायी रूप से (मज़बूती से) नहीं रखा जा सकता है, लेकिन सीरियल करने योग्य व्यक्ति (सीमा के भीतर) कर सकते हैं। चूँकि आपका उत्तर उच्चतम स्कोरिंग है और सभी महत्वपूर्ण अंतरों को कवर करने का आभास देता है, आपको शायद उस बिंदु का उल्लेख करना चाहिए।
लार्स

4
अब Parcelable का कार्यान्वयन Serializable जितना तेज़ है, बस Android Studio में Parcelable को लागू करने वाले किसी भी वर्ग पर ALT + INSERT दबाएँ और IDE यह करेगा।
अली नेम

183

Serializable एक मानक जावा इंटरफ़ेस है। आप बस इंटरफ़ेस को लागू करके एक वर्ग को सीरियल करने योग्य बनाते हैं, और जावा स्वचालित रूप से कुछ स्थितियों में इसे क्रमबद्ध करेगा।

Parcelable एक Android विशिष्ट इंटरफ़ेस है, जहाँ आप क्रमबद्धता को स्वयं कार्यान्वित करते हैं। इसे और अधिक कुशल बनाने के लिए बनाया गया था जो कि सीरियल बनाने योग्य है, और डिफ़ॉल्ट जावा क्रमांकन योजना के साथ कुछ समस्याओं को प्राप्त करने के लिए।

मेरा मानना ​​है कि बाइंडर और एआईडीएल पार्सलेबल ऑब्जेक्ट्स के साथ काम करते हैं।

हालाँकि, आप Intents में Serializable ऑब्जेक्ट्स का उपयोग कर सकते हैं।


1
मैं एक पार्सल योग्य वस्तु को कैसे अनुक्रमित करूं? मैं इसे कैसे बनाऊं?
हेड करता है

@ हाइड वस्तुओं की सामग्री प्राप्त करें और इसे एक फ़ाइल या SQLLite डेटाबेस में संग्रहीत करें। Seriliasing Android में विभिन्न घटकों या अलग-अलग अनुप्रयोगों के बीच वस्तुओं को हस्तांतरणीय बनाने के लिए उपयोगी है।
जोनाथन

6
यह एक महान व्याख्या है। मैंने यह भी देखा: "पार्सल एक सामान्य-प्रयोजन क्रमिक तंत्र नहीं है। यह वर्ग (और पार्सल में मनमानी वस्तुओं को रखने के लिए संबंधित पार्सलेबल एपीआई) को उच्च-प्रदर्शन वाले आईपीसी परिवहन के रूप में डिज़ाइन किया गया है। जैसे, यह उचित नहीं है। किसी भी पार्सल डेटा को लगातार भंडारण में रखें: पार्सल में किसी भी डेटा के अंतर्निहित कार्यान्वयन में परिवर्तन पुराने अपठनीय सॉफ्टवेयर को प्रस्तुत कर सकते हैं। " developer.android.com/reference/android/os/Parcel.html
Sam003

@ शीशेंग का मतलब मनमानी वस्तुओं से है? हम पार्सल में किस तरह की वस्तुएं डाल सकते हैं?
hasnain_ahmad

कैसे के बारे में वस्तुओं को परिवर्तित करने के बारे में gson के बजाय स्ट्रिंग स्ट्रिंग?
FOO

57

पार्सलेबल बनाम सीरियल मैं इन दोनों को संदर्भित करता हूं।

जावा और कोटलिन के लिए

1) जावा

सीरियल, सिंपलिसिटी

Serializable क्या है?

Serializable एक मानक जावा इंटरफ़ेस है। यह एंड्रॉइड एसडीके का हिस्सा नहीं है। इसकी सादगी ही इसकी खूबसूरती है। बस इस इंटरफ़ेस को लागू करने से आपका POJO एक गतिविधि से दूसरी गतिविधि में कूदने के लिए तैयार हो जाएगा।

public class TestModel implements Serializable {

String name;

public TestModel(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}
  • सीरियल करने योग्य की सुंदरता यह है कि आपको केवल एक वर्ग और उसके बच्चों पर सीरियल मॉडल को लागू करने की आवश्यकता है। यह एक मार्कर इंटरफ़ेस है, जिसका अर्थ है कि इसे लागू करने की कोई विधि नहीं है, जावा बस इसे कुशलता से क्रमबद्ध करने के लिए अपना सर्वश्रेष्ठ प्रयास करेगा।

  • इस दृष्टिकोण के साथ समस्या यह है कि प्रतिबिंब का उपयोग किया जाता है और यह एक धीमी प्रक्रिया है। यह तंत्र बहुत सारी अस्थायी वस्तुओं का निर्माण करता है और काफी कचरा संग्रह का कारण बनता है।

पार्सलेबल, द स्पीड

पार्सलबल क्या है?

Parcelable एक अन्य इंटरफ़ेस है। अपने प्रतिद्वंद्वी (सीरियल के मामले में आप भूल गए) के बावजूद, यह एंड्रॉइड एसडीके का एक हिस्सा है। अब, पार्सलबल को विशेष रूप से इस तरह से डिज़ाइन किया गया था कि इसका उपयोग करते समय कोई प्रतिबिंब न हो। ऐसा इसलिए है क्योंकि हम क्रमांकन प्रक्रिया के लिए वास्तव में स्पष्ट हैं।

public class TestModel implements Parcelable {


String name;

public TestModel(String name, String id) {
    this.name = name;
}

protected TestModel(Parcel in) {
    this.name = in.readString();


}

public String getName() {
    return name;
}

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

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.name);

}

public static final Parcelable.Creator<TestModel> CREATOR = new Parcelable.Creator<TestModel>() {
    @Override
    public TestModel createFromParcel(Parcel source) {
        return new TestModel(source);
    }

    @Override
    public TestModel[] newArray(int size) {
        return new TestModel[size];
    }
};
}

अब, विजेता है

यहां छवि विवरण दर्ज करें

Philippe Breault द्वारा किए गए परीक्षणों के परिणाम बताते हैं कि Parcelable Serializable की तुलना में 10x से अधिक तेज है। Google के कुछ अन्य इंजीनियर भी इस कथन के पीछे खड़े हैं।

उनके अनुसार, डिफ़ॉल्ट Serializable दृष्टिकोण Parcelable की तुलना में धीमा है। और यहाँ हम दोनों पक्षों के बीच एक समझौता है! लेकिन, इन दोनों की तुलना करना अनुचित है! क्योंकि Parcelable के साथ हम वास्तव में कस्टम कोड लिख रहे हैं। कोड विशेष रूप से उस एक POJO के लिए बनाया गया है। इस प्रकार, कोई कचरा पैदा नहीं होता है और परिणाम बेहतर होते हैं। लेकिन डिफ़ॉल्ट अनुक्रमिक दृष्टिकोण के साथ, हम जावा के स्वचालित क्रमांकन प्रक्रिया पर भरोसा करते हैं। प्रक्रिया स्पष्ट रूप से बिल्कुल भी कस्टम नहीं है और बहुत सारे कचरे का निर्माण करती है! इस प्रकार, खराब परिणाम।

स्टॉप स्टॉप !!!!, निर्णय लेने से पहले

अब, एक और दृष्टिकोण है । Serializable के पीछे की पूरी स्वचालित प्रक्रिया को कस्टम कोड द्वारा प्रतिस्थापित किया जा सकता है जो writeObject () और readObject () विधियों का उपयोग करता है। ये तरीके विशिष्ट हैं। यदि हम कस्टम क्रमांकन व्यवहार के साथ संयोजन में अनुक्रमिक दृष्टिकोण पर भरोसा करना चाहते हैं, तो हमें नीचे दिए गए एक ही हस्ताक्षर के साथ इन दो विधियों को शामिल करना होगा:

 private void writeObject(java.io.ObjectOutputStream out)
 throws IOException;

 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;

 private void readObjectNoData()
     throws ObjectStreamException;

और अब Parcelable और custom Serializable के बीच तुलना उचित लगती है! परिणाम आश्चर्यजनक हो सकते हैं! कस्टम Serializable दृष्टिकोण लिखने के लिए 3x से अधिक तेज है और Parcelable की तुलना में 1.6x तेजी से पढ़ता है।

संपादित: -----

2) कोटलिनिक्स सीरियल

Kotlinx Serialization Library

For Kotlin serialization need to add below dependency and plugin

implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.9.1"

apply plugin: 'kotlinx-serialization'

आपकी build.gradleफ़ाइल

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlinx-serialization'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.smile.kotlinxretrosample"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.9.1"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.okhttp3:okhttp:3.12.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

Serializing काफी आसानी से की जाती है, आपको @Serializableनीचे दिए गए एनोटेशन के साथ इच्छित वर्ग को एनोटेट करना होगा

import kotlinx.serialization.Serializable
@Serializable
class Field {
    var count: Int = 0
    var name: String = ""
}

नोट करने के लिए दो और एनोटेशन हैं transientऔर optional। क्षणिक का उपयोग करने से धारावाहिक को उस क्षेत्र की अनदेखी होगी और वैकल्पिक का उपयोग करने से धारावाहिक को तोड़ने की अनुमति नहीं होगी यदि कोई फ़ील्ड गायब है, लेकिन साथ ही साथ एक डिफ़ॉल्ट मान प्रदान करना होगा।

@Optional
var isOptional: Boolean = false
@Transient
var isTransient: Boolean = false

नोट : यह डेटा वर्गों के साथ भी काम कर सकता है।

अब वास्तव में इस क्रिया का उपयोग करने के लिए आइए एक उदाहरण लेते हैं कि JSON को ऑब्जेक्ट और बैक में कैसे परिवर्तित किया जाए

 fun toObject(stringValue: String): Field {
        return JSON.parse(Field.serializer(), stringValue)
    }

    fun toJson(field: Field): String {
        //Notice we call a serializer method which is autogenerated from our class 
        //once we have added the annotation to it
        return JSON.stringify(Field.serializer(), field)
    }

के लिए और अधिक


@ फरहान कोटलिन में डेटा क्लास के लिए कैसे करें?
निसर्ग

@Nisarg मैंने Kotlin जोड़ा Serialization, एक नज़र।
फरहाना

@ फरहान यह बहुत ही खुशनुमा था। मैं वास्तव में काम पर कोटलिन में जाना चाहता हूं लेकिन मेरे प्रस्ताव को प्रबंधकों द्वारा लगातार खारिज किया जा रहा है। मैं सोच रहा हूं कि क्या मैं सीरियलेबल (कस्टम विधि के साथ) के लिए बेंचमार्क प्राप्त कर सकता हूं जो आप कहते हैं कि पार्सलबल से 1.6 गुना तेज है।
अभिनव कुलश्रेष्ठ

39

यदि आप एक अच्छे नागरिक बनना चाहते हैं, तो पार्सल को लागू करने के लिए अतिरिक्त समय लें क्योंकि यह 10 गुना तेज प्रदर्शन करेगा और कम संसाधनों का उपयोग करेगा।

हालांकि, ज्यादातर मामलों में, सीरियल की सुस्ती का ध्यान नहीं जाएगा। इसे उपयोग करने के लिए स्वतंत्र महसूस करें लेकिन याद रखें कि क्रमांकन एक महंगा ऑपरेशन है इसलिए इसे कम से कम रखें।

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

इस बिंदु का स्रोत: http://www.developerphil.com/parcelable-vs-serializable/


32

पार्सेबल में, डेवलपर्स मार्शलिंग और अनमर्शिंग के लिए कस्टम कोड लिखते हैं ताकि यह Serialization की तुलना में कम कचरा वस्तुओं का निर्माण करे। इस कस्टम कार्यान्वयन की वजह से सीरियललाइज़ेशन पर पार्सल के प्रदर्शन में नाटकीय रूप से सुधार (लगभग दो गुना तेज) होता है।

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

संपादित करें: मार्शलिंग और अनमर्सहॉलिंग का अर्थ क्या है?

कुछ शब्दों में, "मार्शलिंग" डेटा या वस्तुओं को बाइट-स्ट्रीम में परिवर्तित करने की प्रक्रिया को संदर्भित करता है, और "अनस्मर्शलिंग" बाइट-स्ट्रीम बीक को उनके मूल डेटा या ऑब्जेक्ट में परिवर्तित करने की रिवर्स प्रक्रिया है। रूपांतरण "क्रमांकन" के माध्यम से प्राप्त किया जाता है।

http://www.jguru.com/faq/view.jsp?EID=560072


एक क्रिया उदाहरण के बिना भी बहुत अच्छी व्याख्या। बस मुझे संशोधन के लिए क्या चाहिए था।
सुद

20

मैं वास्तव में सीरियल के लिए वकालत करने वाला एक लड़का होने जा रहा हूं। गति का अंतर इतना अधिक नहीं है क्योंकि उपकरण कई साल पहले की तुलना में बेहतर हैं और अन्य, अधिक सूक्ष्म अंतर भी हैं। अधिक जानकारी के लिए इस मुद्दे पर मेरा ब्लॉग पोस्ट देखें ।


1
शेयर के लिए धन्यवाद। सीरीज़ेबल को लागू करने के लिए इसका कम जटिल और उन दुर्लभ और हाइपर ऑप्टिमाइज़ेशन मामलों में व्यापार बंद का निर्णय लेने की आवश्यकता है।
अंकन-ज़ेरोब

2
वैकल्पिक दृष्टिकोण, विशेष रूप से प्रयोगों और परिणामों के साथ समर्थित होने पर, बहुत मददगार होता है। मुझे बहुत सारे मौजूदा पार्सलबल आधारित स्रोत कोड के साथ काम करना है, और अब इसमें से कुछ को रिफ्लेक्टर कर सकता हूं जो मैंने आपके ब्लॉग पोस्ट को पढ़ा है।
लेस

14

पार्सलेबल Android विकास में एक मानक की तरह है। लेकिन गति के कारण नहीं

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

क्या पार्सलबल तेज है तो सीरियल करने योग्य?

औसत Android डिवाइस पर सामान्य जावा क्रमांकन (यदि सही किया जाता है) लिखने के लिए पार्सल के मुकाबले लगभग 3.6 गुना तेज और रीड के लिए लगभग 1.6 गुना तेज है। इसके अलावा यह साबित होता है कि जावा सीरियलाइज़ेशन (यदि सही किया गया है) तेजी से भंडारण तंत्र है जो प्रत्येक 10 क्षेत्रों के साथ 11000 वस्तुओं के अपेक्षाकृत बड़े ऑब्जेक्ट ग्राफ के साथ भी स्वीकार्य परिणाम देता है।

* विचार यह है कि आम तौर पर हर कोई जो आँख बंद करके कहता है कि "पार्सलबल तेज़ होता है" इसकी तुलना डिफ़ॉल्ट रूप से स्वचालित क्रमांकन से की जाती है, जो अंदर बहुत अधिक प्रतिबिंब का उपयोग करता है। यह अनुचित तुलना है, क्योंकि पार्सलबल स्ट्रीम में डेटा लिखने की प्रक्रिया का मैनुअल (और बहुत जटिल) उपयोग करता है। आमतौर पर जो उल्लेख नहीं किया गया है, वह यह है कि डॉक्स के अनुसार मानक जावा सीरियलाइज़ेशन को राइटऑबजेक्ट () और रीडऑब्जेक्ट () विधियों का उपयोग करके मैन्युअल तरीके से भी किया जा सकता है। अधिक जानकारी के लिए JavaDocs देखें। यह है कि यह सबसे अच्छा प्रदर्शन के लिए कैसे किया जाना चाहिए।

इसलिए, यदि सीरियल करने योग्य तेज़ और लागू करना आसान है, तो एंड्रॉइड के पास पार्सलबल क्यों है?

कारण है देशी कोड। पार्सलबल केवल इंटरप्रोसेस संचार के लिए नहीं बनाया गया है। इसका उपयोग इंटरकोड संचार के लिए भी किया जा सकता है । आप C ++ की मूल परत से ऑब्जेक्ट भेज और पुन: प्राप्त कर सकते हैं। बस।

आपको क्या चुनना चाहिए? दोनों अच्छा काम करेंगे। लेकिन मुझे लगता है कि Parcelable बेहतर विकल्प है क्योंकि यह Google द्वारा अनुशंसित है और जैसा कि आप देख सकते हैं इस धागे से बहुत अधिक सराहना की जाती है।


क्या आप अपने स्रोतों को साइट कर सकते हैं? मुझे वास्तव में इसकी प्रशंसा करनी होगी। धन्यवाद!!
आर्ची जी। Quiñones

2
वह जवाब मुझे अनुभवी डेवलपर से मिला जो AOSP संबंधित प्रोजेक्ट twitter.com/bwdude पर काम करता है । उन्होंने कहा कि एसडीके परत के साथ संचार के लिए देशी सी ++ कोड पार्सल के अपने स्वयं के कार्यान्वयन का उपयोग करता है। मुझे लगता है कि वह इस वर्ग के बारे में बात करते हैं। android.googlesource.com/platform/frameworks/native/+/… मुझे पता है कि यह सबसे अच्छा स्पष्टीकरण नहीं है, लेकिन यह सबसे अच्छा है जो मेरे पास अभी है। यदि आपको कुछ और मिलेगा, तो इसे यहाँ पोस्ट करना सुनिश्चित करें =)
मक्सिम तुराएव

काश मैं तुम्हें एक से अधिक बार उत्थान कर पाता। मैंने बहुत से एंड्रॉइड और जावा विशेषज्ञों को यहां सबसे अधिक उत्तर देने के लिए देखा है। दस्तावेज़ीकरण की कमी ने वास्तव में सीरियल के लिए किसी भी लाइमलाइट को रोका है। ऐसा लगता है कि ये एक विशिष्ट एपीआई को बढ़ावा देने के प्रभाव हैं। धन्यवाद!
पल्प_फिक्शन

11

1. सीरियल

@ वे http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

इंटरफ़ेस क्या?

  • एक मानक जावा इंटरफ़ेस है

गति

  • पार्सलबल की तुलना में धीमी

2. पार्सल करने योग्य

@ वे http://developer.android.com/reference/android/os/Parcelable.html

इंटरफ़ेस क्या?

  • android.os इंटरफ़ेस है
    • जिसका अर्थ है कि Google ने Android पर बेहतर प्रदर्शन के लिए Parcelable विकसित किया है

गति

  • तेज (क्योंकि यह Android विकास पर उपयोग के लिए अनुकूलित है)

> निष्कर्ष में

ज्ञात हो कि Serializable एक मानक जावा इंटरफ़ेस है, और Parcelable Android विकास के लिए है


आपको उनके उपयोग को भी जोड़ना चाहिए।
अंशुल त्यागी

7

मार्शल और अनमैर्शलिंग के संबंध में कुछ प्रदर्शन समस्या है। Parcelable Serializable की तुलना में दोगुना तेज है।

कृपया निम्न लिंक से गुजरें:

http://www.3pillarglobal.com/insights/parcelable-vs-java-serialization-in-android-app-development



4

यदि आप एंड्रॉइड स्टूडियो में पैरासेलेबल प्लगइन का उपयोग करते हैं, तो पार्सलबल का कार्यान्वयन तेज हो सकता है। Android पार्सलबल जनरेटर के लिए खोज


3

Serializable इंटरफ़ेस को Parcelable एक के समान उपयोग किया जा सकता है, जिसके परिणामस्वरूप बेहतर प्रदर्शन नहीं होता है। बस उन दो तरीकों को अधिलेखित करें जो मैनुअल मार्शालिंग और अनमर्सहॉलिंग प्रक्रिया को संभालने के लिए हैं:

private void writeObject(java.io.ObjectOutputStream out)
    throws IOException
private void readObject(java.io.ObjectInputStream in)
    throws IOException, ClassNotFoundException

फिर भी, यह मुझे लगता है कि देशी एंड्रॉइड को विकसित करते समय, एंड्रॉइड एप का उपयोग करने का तरीका है।

देख :


2

मुझे उत्तर देने में देर हो रही है, लेकिन इस उम्मीद के साथ पोस्ट कर रहा हूं कि इससे दूसरों को मदद मिलेगी।

के संदर्भ में स्पीड , Parcelable > Serializable। लेकिन, कस्टम सीरियल करने योग्य अपवाद है। यह लगभग Parcelable या इससे भी अधिक तेज की सीमा में है।

संदर्भ: https://www.geeksforgeeks.org/customized-serialization-and-deserialization-in-java/

उदाहरण :

कस्टम वर्ग को क्रमबद्ध किया जाना है

class MySerialized implements Serializable { 

    String deviceAddress = "MyAndroid-04"; 

    transient String token = "AABCDS"; // sensitive information which I do not want to serialize

    private void writeObject(ObjectOutputStream oos) throws Exception {
        oos.defaultWriteObject();
        oos.writeObject("111111" + token); // Encrypted token to be serialized
    }

    private void readObject(ObjectInputStream ois) throws Exception {
        ois.defaultReadObject(); 
        token = ((String) ois.readObject()).subString(6);  // Decrypting token
    }

}

1

बाइंडर के साथ सीरियल करने योग्य की तुलना में बहुत अधिक तेजी से पार्सल करने योग्य है, क्योंकि सीरियल करने योग्य उपयोग प्रतिबिंब और कई जीसी का कारण बनता है। पार्सलबल ऑब्जेक्ट पास करने के लिए अनुकूलन करने के लिए डिज़ाइन है।

यहाँ संदर्भ के लिए लिंक है। http://www.developerphil.com/parcelable-vs-serializable/


1

आप धारावाहिक में उपयोग करने योग्य वस्तुओं का उपयोग कर सकते हैं, लेकिन धारावाहिक को पार्सल करने योग्य वस्तु बनाने के समय यह NotSerializableException जैसे गंभीर अपवाद दे सकता है। क्या यह पार्सलबल के साथ क्रमिक उपयोग करने की अनुशंसा नहीं की जाती है। इसलिए पार्सल को उस वस्तु के साथ विस्तारित करना बेहतर है जिसे आप बंडल और इंटेंट के साथ उपयोग करना चाहते हैं। चूँकि यह Parcelable Android विशिष्ट है, इसलिए इसका कोई दुष्प्रभाव नहीं है। :)


0

serializable

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

Parcelable

पार्सल सक्षम धारावाहिक से तेज है। पार्सल सक्षम वस्तु को बाइट स्ट्रीम में बदलने और दो गतिविधियों के बीच डेटा पास करने में सक्षम है। लेखन पार्सल सक्षम कोड क्रमांकन की तुलना में थोड़ा जटिल है। यह दो गतिविधियों के बीच डेटा पास करते समय अधिक अस्थायी ऑब्जेक्ट नहीं बनाता है।

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