android - पार्सल की सहायता से एक बाइट सरणी में पार्सेलबल को मार्शल और अनमशेल कैसे करें?




marshalling unmarshalling (2)

मैं एक वर्ग को मार्शल और Parcelable करना चाहता हूं जो Parcelable सरणी से / Parcelable को लागू Parcelable है। मैं इस तथ्य से अच्छी तरह से अवगत हूं कि पार्सलेबल प्रतिनिधित्व स्थिर नहीं है और इसलिए उदाहरणों के दीर्घकालिक भंडारण के लिए नहीं है। लेकिन मेरे पास एक उपयोग का मामला है जहां मुझे किसी ऑब्जेक्ट को क्रमबद्ध करने की आवश्यकता है और यह एक एंड्रॉइड परिवर्तन नहीं होने पर अनमर्शलिंग विफल होने पर शोस्टॉपर नहीं है। इसके अलावा कक्षा पहले ही Parcelable इंटरफ़ेस को कार्यान्वित कर Parcelable है।

एक वर्ग MyClass implements Parcelable , मैं कैसे (ab) marshalling / unmarshalling के लिए Parcelable इंटरफ़ेस का उपयोग कर सकते हैं?


पहले एक सहायक वर्ग पार्सेलबल यूटिल.जावा बनाएं :

public class ParcelableUtil {    
    public static byte[] marshall(Parcelable parceable) {
        Parcel parcel = Parcel.obtain();
        parceable.writeToParcel(parcel, 0);
        byte[] bytes = parcel.marshall();
        parcel.recycle();
        return bytes;
    }

    public static Parcel unmarshall(byte[] bytes) {
        Parcel parcel = Parcel.obtain();
        parcel.unmarshall(bytes, 0, bytes.length);
        parcel.setDataPosition(0); // This is extremely important!
        return parcel;
    }

    public static <T> T unmarshall(byte[] bytes, Parcelable.Creator<T> creator) {
        Parcel parcel = unmarshall(bytes);
        T result = creator.createFromParcel(parcel);
        parcel.recycle();
        return result;
    }
}

उपर्युक्त उपयोग वर्ग की सहायता से, आप अपने वर्ग MyClass implements Parcelable उदाहरणों को मार्शल / MyClass implements Parcelable जैसे MyClass implements Parcelable योग्य:

Unmarshalling ( CREATOR साथ)

byte[] bytes = …
MyClass myclass = ParcelableUtil.unmarshall(bytes, MyClass.CREATOR);

Unmarshalling ( CREATOR बिना)

byte[] bytes = …
Parcel parcel = ParcelableUtil.unmarshall(bytes);
MyClass myclass = new MyClass(parcel); // Or MyClass.CREATOR.createFromParcel(parcel).

मार्शलिंग

MyClass myclass = …
byte[] bytes = ParcelableUtil.marshall(myclass);

public static byte[] pack(Parcelable parcelable) {
    Parcel parcel = Parcel.obtain();
    parcelable.writeToParcel(parcel, 0);
    byte[] bytes = parcel.marshall();
    parcel.recycle();
    return bytes;
}

public static <T> T unpack(byte[] bytes, Parcelable.Creator<T> creator) {
    Parcel parcel = Parcel.obtain();
    parcel.unmarshall(bytes, 0, bytes.length);
    parcel.setDataPosition(0);
    return creator.createFromParcel(parcel);
}

MyObject myObject = unpack(new byte[]{/* bytes */}, MyObject.CREATOR);




parcel