using GeoAPI.Geometries; using HeuristicLab.Persistence.Core; using HeuristicLab.Persistence.Interfaces; using SharpMap.Data; using SharpMap.Data.Providers; using System; using System.Collections.Generic; using System.Data; using System.Linq; namespace HeuristicLab.BioBoost.Persistence { public class GeometryFeatureProviderSerializer : ICompositeSerializer { #region ICompositeSerializer Members public int Priority { get { return 200; } } public bool CanSerialize(Type type) { return type == typeof (GeometryFeatureProvider); } public object CreateInstance(Type type, IEnumerable metaInfo) { var table = new FeatureDataTable(); foreach (var tag in metaInfo) table.Columns.Add(tag.Name, (Type)tag.Value); return new GeometryFeatureProvider(table); } public IEnumerable CreateMetaInfo(object obj) { var gfp = obj as GeometryFeatureProvider; return from DataColumn col in gfp.Features.Columns select new Tag(col.ColumnName, col.DataType); } public IEnumerable Decompose(object obj) { var gfp = obj as GeometryFeatureProvider; foreach (FeatureDataRow row in gfp.Features.Rows) { yield return new Tag(row.ItemArray); yield return new Tag(row.Geometry); } } public string JustifyRejection(Type type) { return "Not a GeometryFeatureProvider"; } public void Populate(object instance, IEnumerable tags, Type type) { var gfp = instance as GeometryFeatureProvider; var it = tags.GetEnumerator(); while (it.MoveNext()) { var row = (FeatureDataRow) gfp.Features.LoadDataRow((object[]) it.Current.Value, LoadOption.OverwriteChanges); if (it.MoveNext()) row.Geometry = (IGeometry) it.Current.Value; else throw new PersistenceException("invalid data format for GeometryDataProvider: interleaved pairs of features and geometries expected"); } } #endregion } }