using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public interface IViz<T> : ISerializable
IEnumerable<SelectedValue> SelectedValues { get; }
public abstract class GroupViz<T, TIn, TOut> : IViz<T>
protected GroupViz(SerializationInfo info, StreamingContext context) { }
private IList<SelectedValue> selectedValues = new List<SelectedValue>();
public abstract void GetObjectData(SerializationInfo info, StreamingContext context);
public IEnumerable<SelectedValue> SelectedValues
get { return selectedValues.Cast<SelectedValue>(); }
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 ValueGroupViz() : base() { }
protected ValueGroupViz(SerializationInfo info, StreamingContext context) : base(info, context) { }
public class EntityValueGroupViz<TEntity, TKey> : ValueGroupViz<TEntity, TKey>
public EntityValueGroupViz() : base() { }
protected EntityValueGroupViz(SerializationInfo info, StreamingContext context) : base(info, 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 class BOEntity { }
public static void Test()
var test = new EntityValueGroupViz<BOEntity, BOEntity>();
test.Value(new SelectedValue<BOEntity>(new BOEntity(), "1"));
test.Value(new SelectedValue<BOEntity>(new BOEntity(), "2"));
Console.WriteLine("Dump of original EntityValueGroupViz<BOEntity, BOEntity>: ");
var bytes = BinaryFormatterHelper.ToBinary(test);
var test2 = BinaryFormatterHelper.FromBinary<EntityValueGroupViz<BOEntity, BOEntity>>(bytes);
Console.WriteLine("Dump of serialized and deserialized EntityValueGroupViz<BOEntity, BOEntity>: ");
public static void Main()
public static partial class BinaryFormatterHelper
public static byte[] ToBinary<T>(T obj)
using (var stream = new MemoryStream())
new BinaryFormatter().Serialize(stream, obj);
public static T FromBinary<T>(byte[] data)
using (var stream = new MemoryStream(data))
var formatter = new BinaryFormatter();
var obj = formatter.Deserialize(stream);