public override IEnumerable Deserialize(ushort protocolVersion, byte[] buffer, int offset, int length, IColumnInfo typeInfo) { ColumnTypeCode?childTypeCode = null; IColumnInfo childTypeInfo = null; var listInfo = typeInfo as ListColumnInfo; if (listInfo != null) { childTypeCode = listInfo.ValueTypeCode; childTypeInfo = listInfo.ValueTypeInfo; } var setInfo = typeInfo as SetColumnInfo; if (setInfo != null) { childTypeCode = setInfo.KeyTypeCode; childTypeInfo = setInfo.KeyTypeInfo; } if (childTypeCode == null) { throw new DriverInternalError(string.Format("CollectionSerializer can not deserialize CQL values of type {0}", typeInfo == null ? "null" : typeInfo.GetType().FullName)); } var count = DecodeCollectionLength((ProtocolVersion)protocolVersion, buffer, ref offset); var childType = GetClrType(childTypeCode.Value, childTypeInfo); var result = Array.CreateInstance(childType, count); for (var i = 0; i < count; i++) { var itemLength = DecodeCollectionLength((ProtocolVersion)protocolVersion, buffer, ref offset); result.SetValue(DeserializeChild(buffer, offset, itemLength, childTypeCode.Value, childTypeInfo), i); offset += itemLength; } return(result); }
public override IEnumerable Deserialize(ushort protocolVersion, byte[] buffer, int offset, int length, IColumnInfo typeInfo) { ColumnTypeCode?childTypeCode = null; IColumnInfo childTypeInfo = null; var listInfo = typeInfo as ListColumnInfo; if (listInfo != null) { childTypeCode = listInfo.ValueTypeCode; childTypeInfo = listInfo.ValueTypeInfo; } var setInfo = typeInfo as SetColumnInfo; if (setInfo != null) { childTypeCode = setInfo.KeyTypeCode; childTypeInfo = setInfo.KeyTypeInfo; } if (childTypeCode == null) { throw new DriverInternalError(string.Format("CollectionSerializer can not deserialize CQL values of type {0}", typeInfo == null ? "null" : typeInfo.GetType().FullName)); } var count = DecodeCollectionLength((ProtocolVersion)protocolVersion, buffer, ref offset); var childType = GetClrType(childTypeCode.Value, childTypeInfo); var result = Array.CreateInstance(childType, count); bool?isNullable = null; for (var i = 0; i < count; i++) { var itemLength = DecodeCollectionLength((ProtocolVersion)protocolVersion, buffer, ref offset); if (itemLength < 0) { if (isNullable == null) { isNullable = !childType.GetTypeInfo().IsValueType; } if (!isNullable.Value) { var nullableType = typeof(Nullable <>).MakeGenericType(childType); var newResult = Array.CreateInstance(nullableType, count); for (var j = 0; j < i; j++) { newResult.SetValue(result.GetValue(j), j); } result = newResult; childType = nullableType; isNullable = true; } result.SetValue(null, i); } else { result.SetValue(DeserializeChild(protocolVersion, buffer, offset, itemLength, childTypeCode.Value, childTypeInfo), i); offset += itemLength; } } return(result); }