朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
基本 バイナリによるシリアライズ





このサンプルコードは、クラスSampleのリストをシリアライズ(保存)し、またデシリアライズ(読み出し)する方法を示しています。このページでは保存した時のデータはバイナリで、ファイルを開いてもそのままでは視認できない状態です。ファイルを開いて確認したい場合はXML形式でのシリアライズすることも可能です。
クラスの宣言に対してSerializable属性をつけますが、実は保存したくないフィールドがある場合、それに対してNonSerializable属性をつけると保存されません。
また、プロパティを設定していても、プライベートなフィールドでもそれに対して直接シリアライズ、デシリアライズが行われるので、プロパティの中で計算処理があっても、実行されません。

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;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace SerializationForClass
{
    public partial class Form1 : Form
    {
        private List<sample> _data = new List<sample>();
        private int _index;
        public Form1()
        {
            InitializeComponent();
        }
        private void btnAdd_Click(object sender, EventArgs e)
        {
            Sample local = new Sample();
            local.BirthDay = this.dateTimePicker1.Value;
            local.Name = this.textBox3.Text;
            local.ID = this._data.Count;
            this._data.Add(local);
        }
        private void btnNext_Click(object sender, EventArgs e)
        {
            _index++;
            if (_data.Count <= _index)
            {
                _index = _data.Count - 1;
            }
            this.textBox1.Text = _data[_index].ID.ToString();
            this.textBox2.Text = _data[_index].Age.ToString();
            this.textBox3.Text = _data[_index].Name;
            this.dateTimePicker1.Value = _data[_index].BirthDay;
        }
        private void btnPrev_Click(object sender, EventArgs e)
        {
            _index--;
            if (_index < 0)
            {
                _index = 0;
            }
            this.textBox1.Text = _data[_index].ID.ToString();
            this.textBox2.Text = _data[_index].Age.ToString();
            this.textBox3.Text = _data[_index].Name;
            this.dateTimePicker1.Value = _data[_index].BirthDay;
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            Stream s = new FileStream("D:\\Data.dat", FileMode.Create, FileAccess.Write, FileShare.None);
            formatter.Serialize(s, _data);
            s.Close();
        }
        private void btnLoad_Click(object sender, EventArgs e)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            Stream s = new FileStream("D:\\Data.dat", FileMode.Open, FileAccess.Read, FileShare.None);
            _data = (List<sample>)formatter.Deserialize(s);
            s.Close();
        }
    }
    [Serializable]
    public class Sample
    {
        private string _name;
        [NonSerialized]
        private int _age;
        private DateTime _birthday;
        private int _id;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        public int Age
        {
            get { return _age; }
            
        }
        public DateTime BirthDay
        {
            get { return _birthday; }
            set
            {
                _birthday = value;
                TimeSpan temp = DateTime.Today-this._birthday;
                this._age = (int)(temp.Days / 365);
            }
        }
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }
    }
}








良いやや良い普通やや悪い悪い
2 0 0 0 0

投稿日時評価コメント