ফাইল থেকে / থেকে সিরিয়ালাইজযোগ্য অবজেক্টটি কীভাবে সংরক্ষণ / পুনরুদ্ধার করবেন?


95

আমার কাছে অবজেক্টগুলির একটি তালিকা রয়েছে এবং এটি আমার কম্পিউটারে কোথাও সংরক্ষণ করতে হবে। আমি কিছু ফোরাম পড়েছি এবং আমি জানি যে অবজেক্টটি থাকতে হবে Serializable। তবে আমি উদাহরণ পেতে পারলে ভাল লাগবে। উদাহরণস্বরূপ যদি আমার নিম্নলিখিত থাকে:

[Serializable]
public class SomeClass
{
     public string someProperty { get; set; }
}

SomeClass object1 = new SomeClass { someProperty = "someString" };

তবে আমি কীভাবে object1আমার কম্পিউটারে কোথাও সঞ্চয় করতে পারি এবং পরে পুনরুদ্ধার করতে পারি?


4
এখানে একটি টিউটোরিয়াল রয়েছে যা দেখায় যে কীভাবে একটি ফাইল সুইচন্টেকোড
ব্রুক

উত্তর:


144

আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

    /// <summary>
    /// Serializes an object.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="serializableObject"></param>
    /// <param name="fileName"></param>
    public void SerializeObject<T>(T serializableObject, string fileName)
    {
        if (serializableObject == null) { return; }

        try
        {
            XmlDocument xmlDocument = new XmlDocument();
            XmlSerializer serializer = new XmlSerializer(serializableObject.GetType());
            using (MemoryStream stream = new MemoryStream())
            {
                serializer.Serialize(stream, serializableObject);
                stream.Position = 0;
                xmlDocument.Load(stream);
                xmlDocument.Save(fileName);
            }
        }
        catch (Exception ex)
        {
            //Log exception here
        }
    }


    /// <summary>
    /// Deserializes an xml file into an object list
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public T DeSerializeObject<T>(string fileName)
    {
        if (string.IsNullOrEmpty(fileName)) { return default(T); }

        T objectOut = default(T);

        try
        {
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(fileName);
            string xmlString = xmlDocument.OuterXml;

            using (StringReader read = new StringReader(xmlString))
            {
                Type outType = typeof(T);

                XmlSerializer serializer = new XmlSerializer(outType);
                using (XmlReader reader = new XmlTextReader(read))
                {
                    objectOut = (T)serializer.Deserialize(reader);
                }
            }
        }
        catch (Exception ex)
        {
            //Log exception here
        }

        return objectOut;
    }

4
সুন্দর! যদিও string attributeXml = string.Empty;ইন DeSerializeObjectকখনও ব্যবহৃত হয় না;)
জিম্বো

4
আপনার ব্যবহারের ব্লকের মধ্যে কোনও পাঠকের কাছে ঘনিষ্ঠ পদ্ধতিটি কল করার দরকার নেই। নিষ্পত্তি () অন্তর্নিহিত এবং স্পষ্টত বন্ধ () এর আগে ব্লকের মধ্যে কোনও ব্যতিক্রম উত্থাপন করা হলেও স্থান গ্রহণ করবে। কোড খুব কার্যকর ব্লক।
এস ব্রেন্টসন

4
এই ফাংশনটি ব্যবহার করে আমি কীভাবে অবজেক্টের একটি তালিকা সংরক্ষণ করব তা এটি ব্যবহার করেছে তবে এটি আমার তালিকার কেবলমাত্র শেষ অবজেক্টটি সংরক্ষণ করছে
ডিকোডার94

4
এই পদ্ধতিটি অভ্যন্তরীণ বা ব্যক্তিগত ক্ষেত্রগুলি সংরক্ষণ করবে না, আপনি এটি ব্যবহার করতে পারেন: github.com/mrbm2007/ObjectSaver
mrbm

152

বাইনারি, এক্সএমএল বা জসন-এ কোনও বস্তুর ডেটা সংরক্ষণ করার জন্য আমি কেবল একটি ব্লগ পোস্ট লিখেছি । আপনি সঠিক যে আপনার ক্লাসগুলি [সিরিয়ালাইজেবল] বৈশিষ্ট্য সহ সজ্জিত করতে হবে তবে আপনি কেবল বাইনারি সিরিয়ালাইজেশন ব্যবহার করছেন। আপনি এক্সএমএল বা জসন সিরিয়ালাইজেশন ব্যবহার করতে পছন্দ করতে পারেন। এটি বিভিন্ন ফর্ম্যাটে এটি করার জন্য এখানে ফাংশন রয়েছে। আরও তথ্যের জন্য আমার ব্লগ পোস্ট দেখুন।

বাইনারি

/// <summary>
/// Writes the given object instance to a binary file.
/// <para>Object type (and all child types) must be decorated with the [Serializable] attribute.</para>
/// <para>To prevent a variable from being serialized, decorate it with the [NonSerialized] attribute; cannot be applied to properties.</para>
/// </summary>
/// <typeparam name="T">The type of object being written to the binary file.</typeparam>
/// <param name="filePath">The file path to write the object instance to.</param>
/// <param name="objectToWrite">The object instance to write to the binary file.</param>
/// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param>
public static void WriteToBinaryFile<T>(string filePath, T objectToWrite, bool append = false)
{
    using (Stream stream = File.Open(filePath, append ? FileMode.Append : FileMode.Create))
    {
        var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        binaryFormatter.Serialize(stream, objectToWrite);
    }
}

/// <summary>
/// Reads an object instance from a binary file.
/// </summary>
/// <typeparam name="T">The type of object to read from the binary file.</typeparam>
/// <param name="filePath">The file path to read the object instance from.</param>
/// <returns>Returns a new instance of the object read from the binary file.</returns>
public static T ReadFromBinaryFile<T>(string filePath)
{
    using (Stream stream = File.Open(filePath, FileMode.Open))
    {
        var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        return (T)binaryFormatter.Deserialize(stream);
    }
}

এক্সএমএল

আপনার প্রকল্পে অন্তর্ভুক্ত করার জন্য System.XML সমাবেশটি প্রয়োজন।

/// <summary>
/// Writes the given object instance to an XML file.
/// <para>Only Public properties and variables will be written to the file. These can be any type though, even other classes.</para>
/// <para>If there are public properties/variables that you do not want written to the file, decorate them with the [XmlIgnore] attribute.</para>
/// <para>Object type must have a parameterless constructor.</para>
/// </summary>
/// <typeparam name="T">The type of object being written to the file.</typeparam>
/// <param name="filePath">The file path to write the object instance to.</param>
/// <param name="objectToWrite">The object instance to write to the file.</param>
/// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param>
public static void WriteToXmlFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
    TextWriter writer = null;
    try
    {
        var serializer = new XmlSerializer(typeof(T));
        writer = new StreamWriter(filePath, append);
        serializer.Serialize(writer, objectToWrite);
    }
    finally
    {
        if (writer != null)
            writer.Close();
    }
}

/// <summary>
/// Reads an object instance from an XML file.
/// <para>Object type must have a parameterless constructor.</para>
/// </summary>
/// <typeparam name="T">The type of object to read from the file.</typeparam>
/// <param name="filePath">The file path to read the object instance from.</param>
/// <returns>Returns a new instance of the object read from the XML file.</returns>
public static T ReadFromXmlFile<T>(string filePath) where T : new()
{
    TextReader reader = null;
    try
    {
        var serializer = new XmlSerializer(typeof(T));
        reader = new StreamReader(filePath);
        return (T)serializer.Deserialize(reader);
    }
    finally
    {
        if (reader != null)
            reader.Close();
    }
}

জসন

আপনাকে অবশ্যই নিউটনসফট.জসন অ্যাসেমব্লির একটি উল্লেখ অন্তর্ভুক্ত করতে হবে, যা জসন.এনইটি নিউজিট প্যাকেজ থেকে পাওয়া যেতে পারে ।

/// <summary>
/// Writes the given object instance to a Json file.
/// <para>Object type must have a parameterless constructor.</para>
/// <para>Only Public properties and variables will be written to the file. These can be any type though, even other classes.</para>
/// <para>If there are public properties/variables that you do not want written to the file, decorate them with the [JsonIgnore] attribute.</para>
/// </summary>
/// <typeparam name="T">The type of object being written to the file.</typeparam>
/// <param name="filePath">The file path to write the object instance to.</param>
/// <param name="objectToWrite">The object instance to write to the file.</param>
/// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param>
public static void WriteToJsonFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
    TextWriter writer = null;
    try
    {
        var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite);
        writer = new StreamWriter(filePath, append);
        writer.Write(contentsToWriteToFile);
    }
    finally
    {
        if (writer != null)
            writer.Close();
    }
}

/// <summary>
/// Reads an object instance from an Json file.
/// <para>Object type must have a parameterless constructor.</para>
/// </summary>
/// <typeparam name="T">The type of object to read from the file.</typeparam>
/// <param name="filePath">The file path to read the object instance from.</param>
/// <returns>Returns a new instance of the object read from the Json file.</returns>
public static T ReadFromJsonFile<T>(string filePath) where T : new()
{
    TextReader reader = null;
    try
    {
        reader = new StreamReader(filePath);
        var fileContents = reader.ReadToEnd();
        return JsonConvert.DeserializeObject<T>(fileContents);
    }
    finally
    {
        if (reader != null)
            reader.Close();
    }
}

উদাহরণ

// Write the contents of the variable someClass to a file.
WriteToBinaryFile<SomeClass>("C:\someClass.txt", object1);

// Read the file contents back into a variable.
SomeClass object1= ReadFromBinaryFile<SomeClass>("C:\someClass.txt");

4
আমি আপনার বাইনারি সিরিয়ালকরণ কোড পছন্দ করি। তবে WritToBinaryFile এ আপনি কেন কখনও ফাইলটিতে যুক্ত করতে চান? মনে হচ্ছে আপনি সব ক্ষেত্রেই একটি নতুন ফাইল তৈরি করতে চান। অন্যথায় deserialization সম্পর্কিত অতিরিক্ত তথ্য একগুচ্ছ থাকত।
সর্বজনীন বেতার

4
@ সার্বজনীন ওয়্যারলেস হ্যাঁ, আপনি সম্ভবত ঠিক বলেছেন। আমি তখন এ নিয়ে খুব একটা ভাবিনি; আমি কেবল তিনটি ফাংশনের স্বাক্ষরগুলি মেলে চেয়েছিলাম: পি
ডেডডডগ

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

4
দয়া করে বাইনারি সিরিয়ালটিতে মন্তব্য যুক্ত করুন যা লোকেদের পরামর্শ দেবে যে ফলস্বরূপ তথ্য সমাবেশের শক্তিশালী নাম দিয়ে স্ট্যাম্প করা হয় এবং এর সংস্করণগুলিতে পরিবর্তনগুলি পুনঃনির্দেশিত বাইন্ডিংগুলি যোগ না করে বা পরিবেশে চালিত করা হয় যা বাইন্ডিংগুলি (যেমন পাওয়ারশেল) সম্মতি দেয় না ব্যর্থ
zaitsman

4
@ জনডেমিট্রিউ যদি কোনও ফাইলে একাধিক জিনিস সংরক্ষণ করা হয় তবে আমি বিষয়গুলি কোনও প্রসঙ্গে প্রাসঙ্গিক বস্তুর মোড়ানো এবং সেই অবজেক্টটি সিরিয়াল করার পরামর্শ দিচ্ছি (অবজেক্ট ম্যানেজারটি আপনার পছন্দসই অংশগুলি পার্স করতে দিন)। আপনি যদি মেমোরিতে রাখতে পারেন তার চেয়ে বেশি ডেটা সংরক্ষণের চেষ্টা করছেন, আপনি কোনও ফাইলের পরিবর্তে কোনও অবজেক্ট স্টোর (অবজেক্ট ডাটাবেস) এ স্যুইচ করতে চাইতে পারেন।
তেজরা

30

আপনাকে কিছুতে সিরিয়ালাইজ করতে হবে: এটি হ'ল বাইনারি বা এক্সএমএল বাছুন (ডিফল্ট সিরিয়ালাইজারের জন্য) বা অন্য কোনও পাঠ্য ফর্মটিতে সিরিয়ালাইজ করতে কাস্টম সিরিয়ালাইজ কোড লিখুন।

একবার আপনি এটি বাছাই হয়ে গেলে, আপনার সিরিয়ালাইজেশন (সাধারণত) কোনও স্ট্রিমকে কল করবে যা কোনও একরকম ফাইলে লিখছে।

সুতরাং, আপনার কোড সহ, যদি আমি এক্সএমএল সিরিয়ালাইজেশন ব্যবহার করতাম:

var path = @"C:\Test\myserializationtest.xml";
using(FileStream fs = new FileStream(path, FileMode.Create))
{
    XmlSerializer xSer = new XmlSerializer(typeof(SomeClass));

    xSer.Serialize(fs, serializableObject);
}

তারপরে, deserialize করতে:

using(FileStream fs = new FileStream(path, FileMode.Open)) //double check that...
{
    XmlSerializer _xSer = new XmlSerializer(typeof(SomeClass));

    var myObject = _xSer.Deserialize(fs);
}

দ্রষ্টব্য: এই কোডটি সংকলিত হয়নি, চালানো যাক - কিছু ত্রুটি হতে পারে। এছাড়াও, এটি সম্পূর্ণরূপে বক্স সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন ধরে নেয়। আপনার যদি কাস্টম আচরণের প্রয়োজন হয় তবে আপনাকে অতিরিক্ত কাজ করতে হবে।


10

1. ফাইল থেকে অবজেক্ট পুনরুদ্ধার

থেকে এখানে আপনি দুটি উপায়ে ফাইল থেকে একটি বস্তু deserialize পারবেন না।

সমাধান -১: ফাইলটিকে স্ট্রিংয়ে পড়ুন এবং একটি প্রকারে জেএসওএনকে deserialize করুন

string json = File.ReadAllText(@"c:\myObj.json");
MyObject myObj = JsonConvert.DeserializeObject<MyObject>(json);

সমাধান -২: সরাসরি কোনও ফাইল থেকে জেএসওনকে ডিসেরায়াল করুন

using (StreamReader file = File.OpenText(@"c:\myObj.json"))
{
    JsonSerializer serializer = new JsonSerializer();
    MyObject myObj2 = (MyObject)serializer.Deserialize(file, typeof(MyObject));
}

২. ফাইলটিতে অবজেক্ট সংরক্ষণ করুন

থেকে এখানে আপনি দুটি ভাবে ফাইলে একটি বস্তু ধারাবাহিকভাবে পারবেন না।

সমাধান -১: একটি স্ট্রিংতে জেএসএনকে সিরিয়াল করুন এবং তারপরে একটি ফাইলে স্ট্রিং লিখুন

string json = JsonConvert.SerializeObject(myObj);
File.WriteAllText(@"c:\myObj.json", json);

সমাধান -২: সরাসরি কোনও ফাইলে জেএসএনকে সিরিয়াল করুন

using (StreamWriter file = File.CreateText(@"c:\myObj.json"))
{
    JsonSerializer serializer = new JsonSerializer();
    serializer.Serialize(file, myObj);
}

3. অতিরিক্ত

আপনি এর থেকে Newtonsoft.Json বিনামূল্যে ডাউনলোড করতে পারেন NuGet নিম্নলিখিত হুকুমে

Install-Package Newtonsoft.Json

1

** ঘ। জেসন স্ট্রিংকে বেস64 স্ট্রিংয়ে রূপান্তর করুন এবং এটি বাইনারি ফাইলে লিখুন বা সংযোজন করুন। ২. বাইনারি ফাইল থেকে বেস 64 স্ট্রিং পড়ুন এবং বিসনরেডার ব্যবহার করে ডিসরিয়ালাইজ করুন। **

 public static class BinaryJson
{
    public static string SerializeToBase64String(this object obj)
    {
        JsonSerializer jsonSerializer = new JsonSerializer();
        MemoryStream objBsonMemoryStream = new MemoryStream();
        using (BsonWriter bsonWriterObject = new BsonWriter(objBsonMemoryStream))
        {
            jsonSerializer.Serialize(bsonWriterObject, obj);
            return Convert.ToBase64String(objBsonMemoryStream.ToArray());
        }           
        //return Encoding.ASCII.GetString(objBsonMemoryStream.ToArray());
    }
    public static T DeserializeToObject<T>(this string base64String)
    {
        byte[] data = Convert.FromBase64String(base64String);
        MemoryStream ms = new MemoryStream(data);
        using (BsonReader reader = new BsonReader(ms))
        {
            JsonSerializer serializer = new JsonSerializer();
            return serializer.Deserialize<T>(reader);
        }
    }
}

1

আপনি নিউটনফট লাইব্রেরি থেকে জসনকনভার্ট ব্যবহার করতে পারেন। কোনও বস্তুকে সিরিয়ালাইজ করতে এবং একটি ফাইলকে json ফর্ম্যাটে লিখতে:

File.WriteAllText(filePath, JsonConvert.SerializeObject(obj));

এবং এটি আবার বস্তুতে deserialize করতে:

var obj = JsonConvert.DeserializeObject<ObjType>(File.ReadAllText(filePath));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.