序列化的一点总结(二)
一些无法序列化的字段(比如这个字段的类型没有标记为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);
}
}
}
浙公网安备 33010602011771号