আমি কীভাবে কোনও বস্তুকে সিরিয়ালাইজ করব এবং এন্ড্রয়েডের কোনও ফাইলে সংরক্ষণ করব?


128

বলুন আমার কিছু সাধারণ বর্গ রয়েছে এবং এটি যখন কোনও বিষয় হিসাবে তাত্ক্ষণিকভাবে ইনস্টল করা হয়ে থাকে তখন আমি একটি ফাইলের বিষয়বস্তুগুলিকে সিরিয়ালায়িত করতে সক্ষম হতে চাই এবং সেই ফাইলটি কিছু পরে লোড করে এটি পুনরুদ্ধার করতে পারি ... আমি নিশ্চিত না যে এখানেই কী শুরু করব, এই বস্তুটি কোনও ফাইলটিতে ক্রমিক করার জন্য আমার কী করা দরকার?

public class SimpleClass {
   public string name;
   public int id;
   public void save() {
       /* wtf do I do here? */
   }
   public static SimpleClass load(String file) {
       /* what about here? */
   }
}

এটি সম্ভবত বিশ্বের সবচেয়ে সহজ প্রশ্ন, কারণ এটি নেট। নেট এ আসলেই একটি সহজ কাজ, তবে অ্যান্ড্রয়েডে আমি বেশ নতুন তাই আমি সম্পূর্ণ হারিয়ে ফেলেছি।

উত্তর:


250

সংরক্ষণ করা (ডাব্লু / ও ব্যতিক্রম হ্যান্ডলিং কোড):

FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(this);
os.close();
fos.close();

লোড হচ্ছে (ডাব্লু / ও ব্যতিক্রম হ্যান্ডলিং কোড):

FileInputStream fis = context.openFileInput(fileName);
ObjectInputStream is = new ObjectInputStream(fis);
SimpleClass simpleClass = (SimpleClass) is.readObject();
is.close();
fis.close();

খুব দরকারী. আপনি দয়া করে ব্যাখ্যা করতে পারেন যে আমাদের অবজেক্ট ফাইল হিসাবে লেখার জন্য ক্লাসটি সিরিয়াল করতে হবে কিনা।
অরুণ চিত্তুর

4
যদি আপনি সিরিয়ালাইজেবল ইন্টারফেস ব্যবহার করেন তবে এই কার্যকারিতা স্পষ্টভাবে আপনার শ্রেণিতে যুক্ত করা হয়েছে। আপনি যদি চান সমস্ত কিছু সরল অবজেক্ট সিরিয়ালাইজেশন হয় তবে আমি এটি ব্যবহার করব। এটি প্রয়োগ করাও চূড়ান্ত সহজ। বিকাশকারী.অ্যান্ড্রয়েড.
com

6
+1 টি সংরক্ষণ কৌতুক আছে একাধিক বস্তু জন্য আবশ্যক: stackoverflow.com/a/1195078/1321401
Luten

2
Fos.close () এবং fis.close () তেও কি কল করা উচিত?
আইসডড্যান্ট

আমি কাগজ সুপারিশ করব । এটি ক্রিয়ো সিরিয়ালাইজেশন এবং আরও দ্রুত সাধারণ জাভা সিরিয়ালাইজেশন ব্যবহার করে।
আলেক্সি মাসনি

36

আমি এই দুটি বিকল্প (পঠন / লেখার) চেষ্টা করেছি, প্লেইন অবজেক্টস সহ, অবজেক্টের অ্যারে (150 বস্তু), মানচিত্র:

বিকল্প 1:

FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(this);
os.close();

OPTION2:

SharedPreferences mPrefs=app.getSharedPreferences(app.getApplicationInfo().name, Context.MODE_PRIVATE);
SharedPreferences.Editor ed=mPrefs.edit();
Gson gson = new Gson(); 
ed.putString("myObjectKey", gson.toJson(objectToSave));
ed.commit();

বিকল্প 2 বিকল্প 1 এর চেয়ে দ্বিগুণ দ্রুত

2 অসুবিধার বিকল্পটি হ'ল আপনাকে পড়ার জন্য নির্দিষ্ট কোড তৈরি করতে হবে:

Gson gson = new Gson();
JsonParser parser=new JsonParser();
//object arr example
JsonArray arr=parser.parse(mPrefs.getString("myArrKey", null)).getAsJsonArray();
events=new Event[arr.size()];
int i=0;
for (JsonElement jsonElement : arr)
    events[i++]=gson.fromJson(jsonElement, Event.class);
//Object example
pagination=gson.fromJson(parser.parse(jsonPagination).getAsJsonObject(), Pagination.class);

3
আপনি কেন বিকল্প 2 দ্রুত বলবেন? সম্ভবত SharedPreferences মেমরিতে রাখা হয়েছে এবং আপনি যে সময়টি মাপা করেছেন তাতে ফাইল সিস্টেমে এটি সংরক্ষণ করা অন্তর্ভুক্ত নয়? আমি এটি জিজ্ঞাসা করছি কারণ আমি ধারণা করব যে কোনও বস্তুর প্রবাহে সিরিয়ালাইজ করা জেএসএন স্ট্রিংয়ের চেয়ে আরও দক্ষ হতে হবে।
সিজারপিম

10

জেনারিক্সের সাথে এটি হ্যান্ডেল করার জন্য আমি কেবল একটি ক্লাস তৈরি করেছি, সুতরাং এটি সমস্ত বস্তুর প্রকারের সাথে ব্যবহার করা যেতে পারে যা সিরিয়ালাইজযোগ্য:

public class SerializableManager {

    /**
     * Saves a serializable object.
     *
     * @param context The application context.
     * @param objectToSave The object to save.
     * @param fileName The name of the file.
     * @param <T> The type of the object.
     */

    public static <T extends Serializable> void saveSerializable(Context context, T objectToSave, String fileName) {
        try {
            FileOutputStream fileOutputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

            objectOutputStream.writeObject(objectToSave);

            objectOutputStream.close();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Loads a serializable object.
     *
     * @param context The application context.
     * @param fileName The filename.
     * @param <T> The object type.
     *
     * @return the serializable object.
     */

    public static<T extends Serializable> T readSerializable(Context context, String fileName) {
        T objectToReturn = null;

        try {
            FileInputStream fileInputStream = context.openFileInput(fileName);
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            objectToReturn = (T) objectInputStream.readObject();

            objectInputStream.close();
            fileInputStream.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        return objectToReturn;
    }

    /**
     * Removes a specified file.
     *
     * @param context The application context.
     * @param filename The name of the file.
     */

    public static void removeSerializable(Context context, String filename) {
        context.deleteFile(filename);
    }

}

7

ত্রুটি পরিচালনা ও সংযুক্ত ফাইল স্ট্রিম সহ সম্পূর্ণ কোড। এটি আপনার শ্রেণিতে যুক্ত করুন যা আপনি সিরিয়ালাইজ করতে এবং ডিসরিয়ালাইজ করতে সক্ষম হতে চান। আমার ক্ষেত্রে ক্লাসের নাম CreateResumeForm। আপনার এটি নিজের শ্রেণীর নামে পরিবর্তন করা উচিত। Androidইন্টারফেসটি Serializableফাইলগুলিতে আপনার অবজেক্টগুলি সংরক্ষণ করতে যথেষ্ট নয়, এটি কেবল স্ট্রিম তৈরি করে।

// Constant with a file name
public static String fileName = "createResumeForm.ser";

// Serializes an object and saves it to a file
public void saveToFile(Context context) {
    try {
        FileOutputStream fileOutputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(this);
        objectOutputStream.close();
        fileOutputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}


// Creates an object by reading it from a file
public static CreateResumeForm readFromFile(Context context) {
    CreateResumeForm createResumeForm = null;
    try {
        FileInputStream fileInputStream = context.openFileInput(fileName);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        createResumeForm = (CreateResumeForm) objectInputStream.readObject();
        objectInputStream.close();
        fileInputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return createResumeForm;
}

আপনার এটিতে এটি ব্যবহার করুন Activity:

form = CreateResumeForm.readFromFile(this);

0

আমি শেয়ারপ্রিফেরেন্সগুলি ব্যবহার করি:

package myapps.serializedemo;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.io.IOException;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

//Create the SharedPreferences
    SharedPreferences sharedPreferences = this.getSharedPreferences("myapps.serilizerdemo", Context.MODE_PRIVATE);
    ArrayList<String> friends = new ArrayList<>();
    friends.add("Jack");
    friends.add("Joe");
    try {

 //Write / Serialize
 sharedPreferences.edit().putString("friends",
    ObjectSerializer.serialize(friends)).apply();
    } catch (IOException e) {
        e.printStackTrace();
    }
//READ BACK
    ArrayList<String> newFriends = new ArrayList<>();
    try {
        newFriends = (ArrayList<String>) ObjectSerializer.deserialize(
                sharedPreferences.getString("friends", ObjectSerializer.serialize(new ArrayList<String>())));
    } catch (IOException e) {
        e.printStackTrace();
    }
    Log.i("***NewFriends", newFriends.toString());
}
}

0

আপনার প্রোগ্রামে আপনাকে অবশ্যই একটি অবজেক্টসিরাইজেশন ক্লাস যুক্ত করতে হবে নিম্নলিখিত নীচেরগুলি কাজ করতে পারে

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;

    public class ObjectSerializer {

public static String serialize(Serializable obj) throws IOException {
    if (obj == null) return "";
    try {
        ByteArrayOutputStream serialObj = new ByteArrayOutputStream();
        ObjectOutputStream objStream = new ObjectOutputStream(serialObj);
        objStream.writeObject(obj);
        objStream.close();
        return encodeBytes(serialObj.toByteArray());
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

public static Object deserialize(String str) throws IOException {
    if (str == null || str.length() == 0) return null;
    try {
        ByteArrayInputStream serialObj = new ByteArrayInputStream(decodeBytes(str));
        ObjectInputStream objStream = new ObjectInputStream(serialObj);
        return objStream.readObject();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

public static String encodeBytes(byte[] bytes) {
    StringBuffer strBuf = new StringBuffer();

    for (int i = 0; i < bytes.length; i++) {
        strBuf.append((char) (((bytes[i] >> 4) & 0xF) + ((int) 'a')));
        strBuf.append((char) (((bytes[i]) & 0xF) + ((int) 'a')));
    }

    return strBuf.toString();
}

public static byte[] decodeBytes(String str) {
    byte[] bytes = new byte[str.length() / 2];
    for (int i = 0; i < str.length(); i+=2) {
        char c = str.charAt(i);
        bytes[i/2] = (byte) ((c - 'a') << 4);
        c = str.charAt(i+1);
        bytes[i/2] += (c - 'a');
    }
    return bytes;
}

}

যদি আপনি নীচের ব্যবহারের তুলনায় ভাগ করে নেওয়া পছন্দগুলি সহ কোনও অ্যারে সঞ্চয় করতে ব্যবহার করছেন: -

SharedPreferences sharedPreferences = this.getSharedPreferences(getPackageName(),MODE_PRIVATE);

সিরিয়াল করতে: -

sharedPreferences.putString("name",ObjectSerializer.serialize(array));

ডিসেরায়ালাইজ করতে: -

newarray = (CAST_IT_TO_PROPER_TYPE) ObjectSerializer.deSerialize(sharedPreferences.getString(name),null);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.