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; } }