public static object Deserialize(this IColumnSpec columnSpec, byte[] rawData)
        {
            object data;
            Type colType;
            switch (columnSpec.ColumnType)
            {
                default:
                    data = Deserialize(columnSpec.ColumnType, rawData);
                    break;

                case ColumnType.List:
                    colType = columnSpec.CollectionValueType.ToType();
                    Type typedColl = typeof(ListInitializer<>).MakeGenericType(colType);
                    ICollectionInitializer list = (ICollectionInitializer) Activator.CreateInstance(typedColl);
                    using (MemoryStream ms = new MemoryStream(rawData))
                    {
                        short nbElem = ms.ReadShort();
                        while (0 < nbElem)
                        {
                            byte[] elemRawData = ms.ReadShortBytes();
                            object elem = Deserialize(columnSpec.CollectionValueType, elemRawData);
                            list.Add(elem);
                        }
                        data = list.Collection;
                    }
                    break;

                case ColumnType.Map:
                    Type keyType = columnSpec.CollectionKeyType.ToType();
                    colType = columnSpec.CollectionValueType.ToType();
                    Type typedDic = typeof(DictionaryInitializer<,>).MakeGenericType(keyType, colType);
                    IDictionaryInitializer dic = (IDictionaryInitializer) Activator.CreateInstance(typedDic);
                    using (MemoryStream ms = new MemoryStream(rawData))
                    {
                        short nbElem = ms.ReadShort();
                        while (0 < nbElem)
                        {
                            byte[] elemRawKey = ms.ReadShortBytes();
                            byte[] elemRawValue = ms.ReadShortBytes();
                            object key = Deserialize(columnSpec.CollectionValueType, elemRawKey);
                            object value = Deserialize(columnSpec.CollectionValueType, elemRawValue);
                            dic.Add(key, value);
                        }
                        data = dic.Collection;
                    }
                    break;

                case ColumnType.Set:
                    colType = columnSpec.CollectionValueType.ToType();
                    Type typedSet = typeof(HashSetInitializer<>).MakeGenericType(colType);
                    ICollectionInitializer set = (ICollectionInitializer) Activator.CreateInstance(typedSet);
                    using (MemoryStream ms = new MemoryStream(rawData))
                    {
                        short nbElem = ms.ReadShort();
                        while (0 < nbElem--)
                        {
                            byte[] elemRawData = ms.ReadShortBytes();
                            object elem = Deserialize(columnSpec.CollectionValueType, elemRawData);
                            set.Add(elem);
                        }
                        data = set.Collection;
                    }
                    break;
            }

            return data;
        }
        public static object DeserializeSet(byte[] rawData, IHashSetAccessor destSet, Func<byte[], object> valueDeserializer)
        {
            using (MemoryStream ms = new MemoryStream(rawData))
            {
                ushort nbElem = ms.ReadUShort();
                while (0 < nbElem)
                {
                    byte[] elemRawData = ms.ReadShortBytes();
                    object elem = valueDeserializer(elemRawData);
                    destSet.AddItem(elem);
                    --nbElem;
                }

                return destSet;
            }
        }
        public static object DeserializeMap(byte[] rawData, IDictionary destMap, Func<byte[], object> keyDeserializer, Func<byte[], object> valueDeserializer)
        {
            using (MemoryStream ms = new MemoryStream(rawData))
            {
                ushort nbElem = ms.ReadUShort();
                while (0 < nbElem)
                {
                    byte[] elemRawKey = ms.ReadShortBytes();
                    byte[] elemRawValue = ms.ReadShortBytes();
                    object key = keyDeserializer(elemRawKey);
                    object value = valueDeserializer(elemRawValue);
                    destMap.Add(key, value);
                    --nbElem;
                }

                return destMap;
            }
        }
        public static object DeserializeList(byte[] rawData, IList destList, Func<byte[], object> valueDeserializer)
        {
            using (MemoryStream ms = new MemoryStream(rawData))
            {
                ushort nbElem = ms.ReadUShort();
                while (0 < nbElem)
                {
                    byte[] elemRawData = ms.ReadShortBytes();
                    object elem = valueDeserializer(elemRawData);
                    destList.Add(elem);
                    --nbElem;
                }

                return destList;
            }
        }