Free cookie consent management tool by TermsFeed Policy Generator

source: branches/New Persistence Exploration/Persistence/Persistence/ArrayFormatters.cs @ 1357

Last change on this file since 1357 was 1357, checked in by epitzer, 15 years ago

Pluginification and major refactoring. (#506)

File size: 3.0 KB
Line 
1using System.Collections;
2using System.Text;
3using HeuristicLab.Persistence.Interfaces;
4using System;
5
6namespace HeuristicLab.Persistence {
7
8
9  public abstract class NumberArray2XmlFormatter : IFormatter {
10
11    public abstract Type Type { get; }
12    public IFormat Format { get { return XmlFormat.Instance; } }
13    protected virtual string Separator { get { return ";"; } }
14    protected abstract string formatValue(object o);
15    protected abstract object parseValue(string o);
16
17    public object Serialize(object obj) {
18      Array a = (Array)obj;
19      StringBuilder sb = new StringBuilder();
20      sb.Append(a.Rank);
21      for (int i = 0; i < a.Rank; i++) {
22        sb.Append(Separator);
23        sb.Append(a.GetLength(i));
24      }
25      foreach (object o in a) {
26        sb.Append(Separator);
27        sb.Append(formatValue(o));
28      }
29      return sb.ToString();
30    }
31
32    public object DeSerialize(object o) {
33      IEnumerator values =
34        ((string)o)
35        .Split(new[] { Separator },
36        StringSplitOptions.RemoveEmptyEntries).GetEnumerator();
37      values.MoveNext();
38      int rank = int.Parse((string)values.Current);
39      int[] lengths = new int[rank];
40      for (int i = 0; i < rank; i++) {
41        values.MoveNext();
42        lengths[i] = int.Parse((string)values.Current);
43      }
44      Array a = Array.CreateInstance(this.Type.GetElementType(), lengths);
45      int[] positions = new int[rank];
46      while (values.MoveNext()) {
47        a.SetValue(parseValue((string)values.Current), positions);
48        positions[0] += 1;
49        for (int i = 0; i < rank - 1; i++) {
50          if (positions[i] >= lengths[i]) {
51            positions[i] = 0;
52            positions[i + 1] += 1;
53          } else {
54            break;
55          }
56        }
57      }
58      return a;
59    }
60  }
61
62
63  public class IntArray2XmlFormatter : NumberArray2XmlFormatter {
64    public override Type Type { get { return typeof(int[]); } }
65    protected override string formatValue(object o) { return o.ToString(); }
66    protected override object parseValue(string o) { return int.Parse(o); }
67  }
68
69
70  public class Int2DArray2XmlFormatter : IntArray2XmlFormatter {
71    public override Type Type { get { return typeof(int[,]); } }
72  }
73
74
75  public class Int3DArray2XmlFormatter : IntArray2XmlFormatter {
76    public override Type Type { get { return typeof(int[, ,]); } }
77  }
78
79
80  public class DoubleArray2XmlFormatter : NumberArray2XmlFormatter {
81    public override Type Type { get { return typeof(double[]); } }
82    protected override string formatValue(object o) { return ((double)o).ToString("r"); }
83    protected override object parseValue(string o) { return double.Parse(o); }
84  }
85
86
87  public class Double2DArray2XmlFormatter : DoubleArray2XmlFormatter {
88    public override Type Type { get { return typeof(double[,]); } }
89  }
90
91
92  public class Double3DArray2XmlFormatter : DoubleArray2XmlFormatter {
93    public override Type Type { get { return typeof(double[, ,]); } }
94  }
95 
96}
Note: See TracBrowser for help on using the repository browser.