乱数クラスのシリアライズ

今日も通常の出社日。
自作の乱数クラスをシリアライズしようとしたが、Randomをメンバに持っていて行き詰った。そこで、RandomをMersenneTwisterに代えて、以下を追加した。
http://takel.jp/mt/

/// <summary>複製</summary>
public object Clone()
{
	MersenneTwister r = new MersenneTwister();
	r.mti = mti;
	r.mt = (uint[])mt.Clone();
	return r;
}
/// <summary>文字列表現</summary>
public string Expression
{
	get {return ToString();}
	set
	{
		if (value.Length != 4+N*4*8/6) throw new ArgumentException();
		mti = short.Parse(value.Substring(0, 4), System.Globalization.NumberStyles.HexNumber);
		byte[] b = Convert.FromBase64String(value.Substring(4));
		for (int i=0;i<mt.Length;++i) mt[i] = BitConverter.ToUInt32(b, i*4);
	}
}
/// <summary>文字列化</summary>
public override string ToString()
{
	byte[] b = new byte[mt.Length*4];
	for (int i=0;i<mt.Length;++i) BitConverter.GetBytes(mt[i]).CopyTo(b, 4*i);
	return mti.ToString("x4") + Convert.ToBase64String(b);
}

Expression以外をXmlIgnoreにすれば、Xmlシリアライズもできる。