/// <summary> /// 写入一个未知类型的值。 /// </summary> /// <param name="value">未知类型的值</param> public void DirectWrite(object value) { valueCopyer.DirectWrite(value); dataWriter.OnWriteValue(key, valueCopyer); }
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); }
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); }
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; }
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); }