コード例 #1
0
ファイル: WriteCopyer.cs プロジェクト: zhusy09/Swifter.Json
 /// <summary>
 /// 写入一个未知类型的值。
 /// </summary>
 /// <param name="value">未知类型的值</param>
 public void DirectWrite(object value)
 {
     valueCopyer.DirectWrite(value);
     dataWriter.OnWriteValue(key, valueCopyer);
 }
コード例 #2
0
        public bool Filter(ValueCopyer valueCopyer)
        {
            var basicType = valueCopyer.TypeCode;

            if (typeof(TMode) == typeof(JsonSerializeModes.ReferenceMode))
            {
                if (basicType == TypeCode.Object && (Options & (JsonFormatterOptions.MultiReferencingNull | JsonFormatterOptions.LoopReferencingNull)) != 0 && valueCopyer.Value is IDataReader dataReader)
                {
                    var reference = GetReference(dataReader);

                    if (reference != null && ((Options & JsonFormatterOptions.MultiReferencingNull) != 0 || IsLoopReferencing(reference)))
                    {
                        valueCopyer.DirectWrite(null);

                        basicType = TypeCode.Empty;
                    }
                }
            }

            if ((Options & JsonFormatterOptions.IgnoreNull) != 0 && basicType == TypeCode.Empty)
            {
                return(false);
            }

            if ((Options & JsonFormatterOptions.IgnoreZero) != 0)
            {
                switch (basicType)
                {
                case TypeCode.SByte:
                    return(valueCopyer.ReadSByte() != 0);

                case TypeCode.Int16:
                    return(valueCopyer.ReadInt16() != 0);

                case TypeCode.Int32:
                    return(valueCopyer.ReadInt32() != 0);

                case TypeCode.Int64:
                    return(valueCopyer.ReadInt64() != 0);

                case TypeCode.Byte:
                    return(valueCopyer.ReadByte() != 0);

                case TypeCode.UInt16:
                    return(valueCopyer.ReadUInt16() != 0);

                case TypeCode.UInt32:
                    return(valueCopyer.ReadUInt32() != 0);

                case TypeCode.UInt64:
                    return(valueCopyer.ReadUInt64() != 0);

                case TypeCode.Single:
                    return(valueCopyer.ReadSingle() != 0);

                case TypeCode.Double:
                    return(valueCopyer.ReadDouble() != 0);

                case TypeCode.Decimal:
                    return(valueCopyer.ReadDecimal() != 0);
                }
            }

            if ((Options & JsonFormatterOptions.IgnoreEmptyString) != 0 &&
                basicType == TypeCode.String &&
                valueCopyer.ReadString() == string.Empty)
            {
                return(false);
            }

            return(true);
        }
コード例 #3
0
ファイル: JsonSerializer.cs プロジェクト: zxbe/Swifter
        private bool Filter(ValueCopyer valueCopyer)
        {
            var basicType = valueCopyer.GetBasicType();

            if ((options & JsonFormatterOptions.MultiReferencingNull) != 0 && (basicType == BasicTypes.Array || basicType == BasicTypes.Object))
            {
                var dataReader = (IDataReader)valueCopyer.Value;

                var objectId = GetObjectId(dataReader);

                if (objectId != -1)
                {
                    valueCopyer.DirectWrite(null);

                    basicType = BasicTypes.Null;
                }
            }

            if ((options & JsonFormatterOptions.IgnoreNull) != 0)
            {
                if (basicType == BasicTypes.Null)
                {
                    return(false);
                }
            }

            if ((options & JsonFormatterOptions.IgnoreZero) != 0)
            {
                switch (valueCopyer.GetBasicType())
                {
                case BasicTypes.SByte:
                    return(valueCopyer.ReadSByte() != 0);

                case BasicTypes.Int16:
                    return(valueCopyer.ReadInt16() != 0);

                case BasicTypes.Int32:
                    return(valueCopyer.ReadInt32() != 0);

                case BasicTypes.Int64:
                    return(valueCopyer.ReadInt64() != 0);

                case BasicTypes.Byte:
                    return(valueCopyer.ReadByte() != 0);

                case BasicTypes.UInt16:
                    return(valueCopyer.ReadUInt16() != 0);

                case BasicTypes.UInt32:
                    return(valueCopyer.ReadUInt32() != 0);

                case BasicTypes.UInt64:
                    return(valueCopyer.ReadUInt64() != 0);

                case BasicTypes.Single:
                    return(valueCopyer.ReadSingle() != 0);

                case BasicTypes.Double:
                    return(valueCopyer.ReadDouble() != 0);

                case BasicTypes.Decimal:
                    return(valueCopyer.ReadDecimal() != 0);
                }
            }

            if ((options & JsonFormatterOptions.IgnoreEmptyString) != 0)
            {
                switch (valueCopyer.GetBasicType())
                {
                case BasicTypes.String:
                    return(valueCopyer.ReadString() != "");
                }
            }

            return(true);
        }
コード例 #4
0
        public void Invoke <TElement>()
        {
            if (FastObjectRW <TElement> .IsFastObjectInterface)
            {
                var objectRW = FastObjectRW <TElement> .Create();

                var map = stackalloc int[objectRW.Count];

                Map = map;

                for (int i = 0; i < DbDataReader.FieldCount; i++)
                {
                    var index = objectRW.GetOrdinal(DbDataReader.GetName(i));

                    if (index >= 0)
                    {
                        map[index] = i + 1;
                    }
                }

                if (DataWriter.ContentType == typeof(TElement[]))
                {
                    ref var appendingInfo = ref GenericAppendingInfo <TElement> .ArrayAppendingInfo;

                    var elements = new TElement[appendingInfo.MostClosestMeanCommonlyUsedLength];

                    int offset = 0;

                    while (DbDataReader.Read())
                    {
                        if (offset >= elements.Length)
                        {
                            Array.Resize(ref elements, offset * 2 + 1);
                        }

                        objectRW.Initialize();

                        objectRW.OnWriteAll(this);

                        elements[offset] = objectRW.content;

                        ++offset;
                    }

                    if (elements.Length != offset)
                    {
                        Array.Resize(ref elements, offset);
                    }

                    appendingInfo.AddUsedLength(offset);

                    DataWriter.Content = elements;

                    Result = true;
                }
                else
                {
                    ref var appendingInfo = ref GenericAppendingInfo <TElement> .OtherAppendingInfo;

                    var copyer = new ValueCopyer();

                    DataWriter.Initialize(appendingInfo.MostClosestMeanCommonlyUsedLength);

                    int offset = 0;

                    while (DbDataReader.Read())
                    {
                        objectRW.Initialize();

                        objectRW.OnWriteAll(this);

                        copyer.DirectWrite(objectRW.content);

                        DataWriter.OnWriteValue(offset, copyer);

                        ++offset;
                    }

                    appendingInfo.AddUsedLength(offset);

                    Result = true;
                }
コード例 #5
0
        private bool Filter(ValueCopyer valueCopyer)
        {
            var basicType = valueCopyer.TypeCode;

            if ((options & (JsonFormatterOptions.MultiReferencingNull | JsonFormatterOptions.LoopReferencingException | JsonFormatterOptions.LoopReferencingNull)) != 0 &&
                basicType == TypeCode.Object &&
                valueCopyer.Value is IDataReader reader &&
                ContainsOrSaveReference(reader))
            {
                valueCopyer.DirectWrite(null);

                basicType = TypeCode.Empty;
            }

            if ((options & JsonFormatterOptions.IgnoreNull) != 0 &&
                basicType == TypeCode.Empty)
            {
                return(false);
            }

            if ((options & JsonFormatterOptions.IgnoreZero) != 0)
            {
                switch (basicType)
                {
                case TypeCode.SByte:
                    return(valueCopyer.ReadSByte() != 0);

                case TypeCode.Int16:
                    return(valueCopyer.ReadInt16() != 0);

                case TypeCode.Int32:
                    return(valueCopyer.ReadInt32() != 0);

                case TypeCode.Int64:
                    return(valueCopyer.ReadInt64() != 0);

                case TypeCode.Byte:
                    return(valueCopyer.ReadByte() != 0);

                case TypeCode.UInt16:
                    return(valueCopyer.ReadUInt16() != 0);

                case TypeCode.UInt32:
                    return(valueCopyer.ReadUInt32() != 0);

                case TypeCode.UInt64:
                    return(valueCopyer.ReadUInt64() != 0);

                case TypeCode.Single:
                    return(valueCopyer.ReadSingle() != 0);

                case TypeCode.Double:
                    return(valueCopyer.ReadDouble() != 0);

                case TypeCode.Decimal:
                    return(valueCopyer.ReadDecimal() != 0);
                }
            }

            if ((options & JsonFormatterOptions.IgnoreEmptyString) != 0 &&
                basicType == TypeCode.String &&
                valueCopyer.ReadString() == string.Empty)
            {
                return(false);
            }

            return(true);
        }