using System.Collections.Generic;
using System.Runtime.Serialization;
public interface IViz<T> : ISerializable
IEnumerable<SelectedValue> SelectedValues { get; }
public abstract class GroupViz<T, TIn, TOut> : IViz<T> {
private IList<SelectedValue> selectedValues;
public IEnumerable<SelectedValue> SelectedValues
get { return selectedValues.Cast<SelectedValue>(); }
public abstract void GetObjectData(SerializationInfo info, StreamingContext context);
public void Value(SelectedValue @value)
this.AddValue(@value.Value, @value.Operator);
private void AddValue(object @value, object vizOperator)
SelectedValue<TOut> selectedValue = new SelectedValue<TOut>((TOut)value, vizOperator);
if (!this.selectedValues.Any(sv => sv.Equals(selectedValue)))
this.selectedValues.Add(selectedValue);
public abstract class ValueGroupViz<T, TIn> : GroupViz<T, TIn, TIn>
public class EntityValueGroupViz<TEntity, TKey> : ValueGroupViz<TEntity, TKey>
public EntityValueGroupViz(SerializationInfo info, StreamingContext context)
foreach (SerializationEntry entry in info)
foreach (SelectedValue sv in (IEnumerable<SelectedValue>)entry.Value)
public override void GetObjectData(SerializationInfo info, StreamingContext context)
info.AddValue("SelectedValues", SelectedValues);
public abstract class SelectedValue : ISerializable
private object vizOperator;
public SelectedValue(object value, object vizOperator)
this.vizOperator = vizOperator;
public SelectedValue(SerializationInfo info, StreamingContext context)
foreach (SerializationEntry entry in info)
#region System.Runtime.Serialization.ISerializable overridings
public void GetObjectData(SerializationInfo info, StreamingContext context)
info.AddValue("Value", Value);
info.AddValue("Operator", Operator);
public class SelectedValue<T> : SelectedValue, ISerializable
public SelectedValue(T value, object vizOperator)
: base(value, vizOperator)
public SelectedValue(SerializationInfo info, StreamingContext context)
public abstract class QueryContext<T> : ISerializable
protected IList<IViz<T>> vizs;
this.vizs = new List<IViz<T>>();
public abstract void GetObjectData(SerializationInfo info, StreamingContext context);
public class EntityQueryContext<TEntity> : QueryContext<TEntity>
public EntityQueryContext()
public EntityQueryContext(SerializationInfo info, StreamingContext context)
foreach (SerializationEntry entry in info)
this.vizs = (IList<IViz<TEntity>>)entry.Value;
public override void GetObjectData(SerializationInfo info, StreamingContext context)
info.AddValue("Visualizations", this.vizs.ToList<IViz<TEntity>>());
public class BOEntity { }
public class UIConfiguration
private IList<QueryContext<BOEntity>> queryContexs;
this.queryContexs = new List<QueryContext<BOEntity>>();
public IList<QueryContext<BOEntity>> QueryContexs
public static UIConfiguration ReadConfiguration(string userId)
UIConfiguration configuration = new UIConfiguration();
var f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
if (System.IO.File.Exists("file.bin"))
using (var stm = new System.IO.FileStream("file.bin", System.IO.FileMode.Open))
IList<QueryContext<BOEntity>> entityQueries = f.Deserialize(stm) as IList<QueryContext<BOEntity>>;
configuration.QueryContexs = entityQueries;
public static void WriteConfiguration(UIConfiguration configuration)
if (configuration != null)
var f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
using (var stm = new System.IO.FileStream("file.bin", System.IO.FileMode.OpenOrCreate))
f.Serialize(stm, configuration.QueryContexs);
public static void Main()
UIConfiguration configuration = new UIConfiguration();
configuration.QueryContexs.Add(new EntityQueryContext<BOEntity>());
Program.WriteConfiguration(configuration);