internal byte[] Serialize(object value)
        {
            if (value == Unset.Value)
            {
                if (_protocolVersion < 4)
                {
                    throw new InvalidTypeException("Unset is not supported by this Cassandra version");
                }
                //Return a buffer that represents the value Unset
                return(UnsetBuffer);
            }
            if (value == null)
            {
                return(null);
            }
            var             type = value.GetType();
            ITypeSerializer typeSerializer;

            if (_primitiveSerializers.TryGetValue(type, out typeSerializer))
            {
                return(typeSerializer.Serialize(_protocolVersion, value));
            }
            if (_customSerializers.Count > 0 && _customSerializers.TryGetValue(type, out typeSerializer))
            {
                return(typeSerializer.Serialize(_protocolVersion, value));
            }
            if (typeof(IEnumerable).GetTypeInfo().IsAssignableFrom(type))
            {
                if (typeof(IDictionary).GetTypeInfo().IsAssignableFrom(type))
                {
                    return(_dictionarySerializer.Serialize(_protocolVersion, (IDictionary)value));
                }
                return(_collectionSerializer.Serialize(_protocolVersion, (IEnumerable)value));
            }
            if (typeof(IStructuralComparable).GetTypeInfo().IsAssignableFrom(type) && type.FullName.StartsWith("System.Tuple"))
            {
                return(_tupleSerializer.Serialize(_protocolVersion, (IStructuralEquatable)value));
            }
            var buffer = _udtSerializer.Serialize(_protocolVersion, value);

            if (buffer != null)
            {
                return(buffer);
            }
            throw new InvalidTypeException("Unknown Cassandra target type for CLR type " + type.FullName);
        }
Exemple #2
0
        public byte[] Serialize(ProtocolVersion version, object value)
        {
            if (value == Unset.Value)
            {
                if (!version.SupportsUnset())
                {
                    throw new InvalidTypeException("Unset is not supported by this Cassandra version");
                }
                //Return a buffer that represents the value Unset
                return(SerializerManager.UnsetBuffer);
            }
            if (value == null)
            {
                return(null);
            }
            var type = value.GetType();

            if (_primitiveSerializers.TryGetValue(type, out ITypeSerializer typeSerializer))
            {
                return(typeSerializer.Serialize((byte)version, value));
            }
            if (_customSerializers.Count > 0 && _customSerializers.TryGetValue(type, out typeSerializer))
            {
                return(typeSerializer.Serialize((byte)version, value));
            }
            if (typeof(IEnumerable).GetTypeInfo().IsAssignableFrom(type))
            {
                if (typeof(IDictionary).GetTypeInfo().IsAssignableFrom(type))
                {
                    return(_dictionarySerializer.Serialize((byte)version, (IDictionary)value));
                }
                return(_collectionSerializer.Serialize((byte)version, (IEnumerable)value));
            }
            if (Utils.IsTuple(type))
            {
                return(_tupleSerializer.Serialize((byte)version, (IStructuralEquatable)value));
            }
            var buffer = _udtSerializer.Serialize((byte)version, value);

            if (buffer != null)
            {
                return(buffer);
            }
            throw new InvalidTypeException("Unknown Cassandra target type for CLR type " + type.FullName);
        }