반응형

* 객체 직렬화 (Serialization)

 - 객체를 메모리나 파일 , 데이터베이스에 저장할 때 쓰이는 방식

 

* 예제

 

메인화면

Form1.cs

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ObjectSerialization_File
{

    public partial class Form1 : Form
    {
        //객체 저장을 위한 변수 선언...
        ObjectClass oc = new ObjectClass();
        ObjectStruct os = new ObjectStruct();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //저장

            //객체 클래스 변수 값 변경...
            oc.FniValue = 1500;
            oc.FnjVlaue = 3000;

            using (System.IO.Stream stm = System.IO.File.Open("ect.dat", System.IO.FileMode.Create , System.IO.FileAccess.ReadWrite  ))
            {
                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                //객체 직렬화 저장
                bf.Serialize(stm, oc);
                stm.Close();
            }

            textBox1.Text += "Object Class" + System.Environment.NewLine;
            textBox1.Text += "i Value : " + oc.FniValue.ToString() + System.Environment.NewLine;
            textBox1.Text += "j Value : " + oc.FnjVlaue.ToString() + System.Environment.NewLine;
            textBox1.Text += "i+j Value : " + oc.GetValue().ToString() + System.Environment.NewLine;
            textBox1.Text += "객체 클래스 저장 완료..." + System.Environment.NewLine;

            //객체 구조체 변수 값 변경...
            os.i = 30000;
            os.j = 40000;

            using (System.IO.Stream stm = System.IO.File.Open("ect2.dat", System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite))
            {
                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                //객체 직렬화 저장
                bf.Serialize(stm, os);
                stm.Close();
            }
            textBox1.Text += "Object Struct" + System.Environment.NewLine;
            textBox1.Text += "i Value : " + os.i .ToString() + System.Environment.NewLine;
            textBox1.Text += "j Value : " + os.j.ToString() + System.Environment.NewLine;
            textBox1.Text += "객체 구조체 저장 완료..." + System.Environment.NewLine;

            textBox1.Text += "===============" + System.Environment.NewLine;

        }

        private void button2_Click(object sender, EventArgs e)
        {
            ObjectClass LoadOC;
            ObjectStruct LoadOS;

            //불러오기
            using (System.IO.Stream stm = System.IO.File.Open("ect.dat", System.IO.FileMode.Open, System.IO.FileAccess.Read))
            {
                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                //직렬화 된 객체 역직렬화 및 다시 객체 클래스로 형변환
                LoadOC = (ObjectClass) bf.Deserialize(stm);
                stm.Close();
            }

            textBox1.Text += "Object Class" + System.Environment.NewLine;
            textBox1.Text += "i Value : " + LoadOC.FniValue.ToString() + System.Environment.NewLine;
            textBox1.Text += "j Value : " + LoadOC.FnjVlaue.ToString() + System.Environment.NewLine;
            textBox1.Text += "i+j Value : " + LoadOC.GetValue().ToString() + System.Environment.NewLine;
            textBox1.Text += "객체 클래스 불러오기 완료..." + System.Environment.NewLine;

            using (System.IO.Stream stm = System.IO.File.Open("ect2.dat", System.IO.FileMode.Open, System.IO.FileAccess.Read))
            {
                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                //직렬화 된 객체 역직렬화 및 다시 구조체로 형변환
                LoadOS  = (ObjectStruct) bf.Deserialize(stm)  ;
                stm.Close();
            }

            textBox1.Text += "Object Struct" + System.Environment.NewLine;
            textBox1.Text += "i Value : " + LoadOS.i.ToString() + System.Environment.NewLine;
            textBox1.Text += "j Value : " + LoadOS.j.ToString() + System.Environment.NewLine;
            textBox1.Text += "객체 구조체 불러오기 완료..." + System.Environment.NewLine;
        }
    }

    //객체 직렬화를 위한 클래스 선언...
    [Serializable]
    public class ObjectClass
    {
        int i = 300;
        int j = 100;

        public int FniValue
        {
            get { return i;}
            set { i = value;}
        }

        public int FnjVlaue
        {
            get { return j; }
            set { j = value; }
        }


        public int GetValue()
        {
            return i + j;
        }
    }

    //객체 직렬화를 위한 구조체 선언...
    [Serializable]
    public struct ObjectStruct
    {
        public int i;
        public int j;
    }
}

* 객체 직렬화를 위해서는 그 선언 객체에 반드시 [Serializable] 을 붙여 줘야 됨.

 

반응형

+ Recent posts