using System.Collections; using System.Text; using HeuristicLab.Persistence.Interfaces; using System; namespace HeuristicLab.Persistence { public abstract class NumberArray2XmlFormatter : IFormatter { public abstract Type Type { get; } public IFormat Format { get { return XmlFormat.Instance; } } protected virtual string Separator { get { return ";"; } } protected abstract string formatValue(object o); protected abstract object parseValue(string o); public object Serialize(object obj) { Array a = (Array)obj; StringBuilder sb = new StringBuilder(); sb.Append(a.Rank); for (int i = 0; i < a.Rank; i++) { sb.Append(Separator); sb.Append(a.GetLength(i)); } foreach (object o in a) { sb.Append(Separator); sb.Append(formatValue(o)); } return sb.ToString(); } public object DeSerialize(object o) { IEnumerator values = ((string)o) .Split(new[] { Separator }, StringSplitOptions.RemoveEmptyEntries).GetEnumerator(); values.MoveNext(); int rank = int.Parse((string)values.Current); int[] lengths = new int[rank]; for (int i = 0; i < rank; i++) { values.MoveNext(); lengths[i] = int.Parse((string)values.Current); } Array a = Array.CreateInstance(this.Type.GetElementType(), lengths); int[] positions = new int[rank]; while (values.MoveNext()) { a.SetValue(parseValue((string)values.Current), positions); positions[0] += 1; for (int i = 0; i < rank - 1; i++) { if (positions[i] >= lengths[i]) { positions[i] = 0; positions[i + 1] += 1; } else { break; } } } return a; } } public class IntArray2XmlFormatter : NumberArray2XmlFormatter { public override Type Type { get { return typeof(int[]); } } protected override string formatValue(object o) { return o.ToString(); } protected override object parseValue(string o) { return int.Parse(o); } } public class Int2DArray2XmlFormatter : IntArray2XmlFormatter { public override Type Type { get { return typeof(int[,]); } } } public class Int3DArray2XmlFormatter : IntArray2XmlFormatter { public override Type Type { get { return typeof(int[, ,]); } } } public class DoubleArray2XmlFormatter : NumberArray2XmlFormatter { public override Type Type { get { return typeof(double[]); } } protected override string formatValue(object o) { return ((double)o).ToString("r"); } protected override object parseValue(string o) { return double.Parse(o); } } public class Double2DArray2XmlFormatter : DoubleArray2XmlFormatter { public override Type Type { get { return typeof(double[,]); } } } public class Double3DArray2XmlFormatter : DoubleArray2XmlFormatter { public override Type Type { get { return typeof(double[, ,]); } } } }