序列化的一点总结(二)

       一些无法序列化的字段(比如这个字段的类型没有标记为Serializable),则可以对其继承ISerializable接口,通过这个接口的public void GetObjectData(SerializationInfo info, StreamingContext context)来自定义序列化过程,通过构造一个包含SerializationInfo info, StreamingContext context这两个参数的构造函数来反序列化。

    public   class CMatrix:Matrix<complex>,ISerializable
{
protected int _rowCount, _columnCount;
public int RowCount { get { return _rowCount; } protected set { _rowCount = value; } }
public int ColumnCount { get { return _columnCount; } protected set { _columnCount = value; } }

protected ILArray<T> _data;
public virtual ILArray<T> Data { get { return _data; } protected set { _data = value; } }

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Rows", _rowCount);
info.AddValue("Columns", _columnCount);
var data = new List<double>(_rowCount * _columnCount * 2);
foreach (var item in _data.Values)
{
data.Add(item.real);
data.Add(item.imag);
}
info.AddValue("Data", data);
}

private CMatrix(SerializationInfo info, StreamingContext context)
{
_rowCount = info.GetInt32("Rows");
_columnCount = info.GetInt32("Columns");
var data = (List<double>) info.GetValue("Data",typeof(List<double>));

_data = new ILArray<complex>(_rowCount, _columnCount);
for (int i = 0; i < _rowCount; i++)
{
for (int j = 0; j < _columnCount; j++)
{
_data.SetValue(new complex(data[2 * (i + j * _rowCount)],data[2 * (i + j * _rowCount)+1]),i,j);
}
}
}

posted on 2012-03-02 21:02  小指令  阅读(248)  评论(0)    收藏  举报

导航