private DateTime?DeserializeDateTime(string value)
        {
            if (value.Length == 0)
            {
                return(null);
            }

            return(SerializerUtil.ParseDateTime(value, null, _option.DateTimeZoneHandling));
        }
        private object DeserializeValue(Type type)
        {
            var stype    = type.GetNonNullableType();
            var typeCode = Type.GetTypeCode(stype);

            if (typeCode == TypeCode.Object && stype != typeof(TimeSpan))
            {
                return(ParseObject(type));
            }

            if (_xmlReader.IsEmptyElement)
            {
                if (_xmlReader.NodeType == XmlNodeType.Element)
                {
                    XmlReaderHelper.ReadAndConsumeMatchingEndElement(_xmlReader);
                }

                return(type.GetDefaultValue());
            }

            bool beStartEle;

            if ((beStartEle = (_xmlReader.NodeType == XmlNodeType.Element)))
            {
                XmlReaderHelper.ReadUntilAnyTypesReached(_xmlReader, new[] { XmlNodeType.EndElement, XmlNodeType.Text, XmlNodeType.CDATA });
            }

            var value = _xmlReader.NodeType == XmlNodeType.EndElement ? string.Empty : _xmlReader.ReadContentAsString();

            if (beStartEle)
            {
                XmlReaderHelper.ReadAndConsumeMatchingEndElement(_xmlReader);
            }

            if (type.GetNonNullableType() == typeof(DateTime))
            {
                CheckNullString(value, type);
                return(SerializerUtil.ParseDateTime(value, _option.Culture, _option.DateTimeZoneHandling));
            }
            else if (type.GetNonNullableType() == typeof(TimeSpan))
            {
                if (TimeSpan.TryParse(value, out TimeSpan result))
                {
                    return(result);
                }
            }

            return(value.ToType(type));
        }
        private object DeserializeValue(Type type)
        {
            if (_jsonReader.IsNull())
            {
                if ((type.GetNonNullableType().IsValueType&& !type.IsNullableType()))
                {
                    throw new SerializationException(SR.GetString(SRKind.JsonNullableType, type));
                }

                return(null);
            }

            var stype    = type.GetNonNullableType();
            var typeCode = Type.GetTypeCode(stype);

            if (typeCode == TypeCode.Object)
            {
                return(ParseObject(type));
            }

            var value = _jsonReader.ReadValue();

            if (type.IsNullableType() && (value == null || string.IsNullOrEmpty(value.ToString())))
            {
                return(null);
            }

            switch (typeCode)
            {
            case TypeCode.DateTime:
                CheckNullString(value, type);
                return(SerializerUtil.ParseDateTime(value.ToString(), _option.Culture, _option.DateTimeZoneHandling));

            case TypeCode.String:
                return(value == null ? null : DeserializeString(value.ToString()));

            default:
                CheckNullString(value, type);
                try
                {
                    return(value.ToType(stype));
                }
                catch (Exception ex)
                {
                    throw new SerializationException(SR.GetString(SRKind.DeserializeError, value, type), ex);
                }
            }
        }