Serialize




データ保存の方法としてSerializeが使えそうなのでテスト。

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

// シリアライズするクラスによってシリアライズされるクラス
[Serializable]
internal class MyData
{
public int x, y;
// 引数ナシのコンストラクタを定義
public MyData()
{
x = 0;
y = 0;
}
// Deserialize時に使用するシグネチャコンストラクタを定義する
public MyData(SerializationInfo info, StreamingContext sc)
{
x = (int)info.GetValue("x", typeof(int));
y = (int)info.GetValue("y", typeof(int));
}
// Serialize時に使用するGetObjectDataの実装
public void GetObjectData(SerializationInfo info, StreamingContext sc)
{
info.AddValue("x", x);
info.AddValue("y", y);
}
}

// シリアライズするクラス
[Serializable]
internal class MyClass
{
public string Signature;
public uint Count;
public MyData Data;

// 引数ナシのコンストラクタを定義
public MyClass()
{
Signature = "SaRU";
Count = 0;
Data = new MyData();
}
// Deserialize時に使用するシグネチャコンストラクタを定義する
public MyClass(SerializationInfo info, StreamingContext sc)
{
Signature = (string)info.GetValue("Signature", typeof(string));
Count = (uint)info.GetValue("Count", typeof(uint));
Data = (MyData)info.GetValue("Data", typeof(MyData));
}

// Serialize時に使用するGetObjectDataの実装
public void GetObjectData(SerializationInfo info, StreamingContext sc)
{
info.AddValue("Signature", Signature);
info.AddValue("Count", Count);
info.AddValue("Data", Data);
}
}

class Class1
{
[STAThread]
static void Main(string[] args)
{
MyClass myclass = new MyClass();
myclass.Signature = "OSaRU";
myclass.Count = 24;
myclass.Data.x = 100;
myclass.Data.y = 200;

// シリアライズ
FileStream fs = new FileStream("test.dat", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
try
{
bf.Serialize(fs, myclass);
}
catch (SerializationException e)
{
Console.WriteLine("Failed to serialize. Reason: " + e.Message);
throw;
}
finally
{
fs.Close();
}

// デシリアライズ
myclass = null;
fs = new FileStream("test.dat", FileMode.Open);
bf = new BinaryFormatter();

try
{
myclass = (MyClass)bf.Deserialize(fs);
}
catch (SerializationException e)
{
Console.WriteLine("Failed to deserialize. Reason: " + e.Message);
throw;
}
finally
{
fs.Close();
}

// 表示
Console.WriteLine("Signature:" + myclass.Signature.ToString());
Console.WriteLine("Count:" + myclass.Count.ToString());
Console.WriteLine("Data.x:" + myclass.Data.x.ToString());
Console.WriteLine("Data.y:" + myclass.Data.y.ToString());
Console.ReadLine();
}
}

結果

Signature:OSaRU

Count:24

Data.x:100

Data.y:200

iniファイルを利用しているような感覚。オブジェクトも格納できる(そのオブジェクトがSerializableになっている必要があるが)。



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です