Beispiel #1
0
        /// <summary>
        /// 对数据源中的原有成员的名称和值进行筛选,并将满足筛选的结果写入到数据写入器中。
        /// </summary>
        /// <param name="dataWriter">数据写入器</param>
        /// <param name="valueFilter">值筛选器</param>
        public void OnReadAll(IDataWriter <string> dataWriter, IValueFilter <string> valueFilter)
        {
            var filter = new DataFilterWriter <string>(dataWriter, valueFilter);

            if ((flags & XBindingFlags.SkipDefaultValue) != 0)
            {
                var valueCopyer = new ValueCopyer();

                foreach (var item in fields)
                {
                    item.OnReadValue(obj, valueCopyer);

                    if (!valueCopyer.IsEmptyValue())
                    {
                        valueCopyer.WriteTo(filter[item.Name]);
                    }
                }
            }
            else
            {
                foreach (var item in fields)
                {
                    item.OnReadValue(obj, filter[item.Name]);
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// 初始化值写入暂存器。
        /// </summary>
        /// <param name="dataWriter">数据读写器</param>
        /// <param name="key">键</param>
        public WriteCopyer(IDataWriter <TKey> dataWriter, TKey key)
        {
            this.dataWriter = dataWriter;
            this.key        = key;

            valueCopyer = new ValueCopyer();
        }
Beispiel #3
0
            /// <summary>
            /// 初始化值暂存器。
            /// </summary>
            /// <param name="dataRW">数据读写器</param>
            /// <param name="key">键</param>
            internal FastFieldRW(FastObjectRW <T> dataRW, long key)
            {
                this.dataRW = dataRW;
                this.key    = key;

                valueCopyer = new ValueCopyer();
            }
Beispiel #4
0
        /// <summary>
        /// 初始化值读取暂存器。
        /// </summary>
        /// <param name="dataReader">数据读写器</param>
        /// <param name="key">键</param>
        public ReadCopyer(IDataReader <TKey> dataReader, TKey key)
        {
            this.dataReader = dataReader;
            this.key        = key;

            valueCopyer = new ValueCopyer();
        }
Beispiel #5
0
        public void XObjectTest()
        {
            var rw = XObjectRW.Create <ObjectTester>();

            AreEqual(rw.Content, null);

            AreEqual(rw.Count, 2);

            AreEqual(rw.ContentType, typeof(ObjectTester));

            rw.Initialize();

            AreNotEqual(rw.Content, null);

            AreEqual(((ObjectTester)rw.Content).Id, 0);
            AreEqual(((ObjectTester)rw.Content).Name, null);

            rw["@id"].WriteInt32(123);
            rw["@name"].WriteString("Dogwei");

            AreEqual(((ObjectTester)rw.Content).Id, 123);
            AreEqual(((ObjectTester)rw.Content).Name, "Dogwei");

            AreEqual(rw["@id"].ReadInt32(), 123);
            AreEqual(rw["@name"].ReadString(), "Dogwei");

            IsTrue(
                ValueInterface <Dictionary <string, object> > .ReadValue(ValueCopyer.ValueOf(rw)) is Dictionary <string, object> dic &&
                dic.Count == 2 &&
                (int)dic["@id"] == 123 &&
                (string)dic["@name"] == "Dogwei"
                );
        }
Beispiel #6
0
        /// <summary>
        /// 读取一个对象结构数据。
        /// </summary>
        /// <param name="valueWriter">对象结构数据写入器</param>
        public void ReadObject(IDataWriter <string> valueWriter)
        {
            var valueCopyer = new ValueCopyer();

            fieldRW.OnReadValue(obj, valueCopyer);

            valueCopyer.ReadObject(valueWriter);
        }
Beispiel #7
0
        /// <summary>
        /// 写入一个数组结构数据。
        /// </summary>
        /// <param name="dataReader">数组结构数据读取器</param>
        public void WriteArray(IDataReader <int> dataReader)
        {
            var valueCopyer = new ValueCopyer();

            valueCopyer.WriteArray(dataReader);

            fieldRW.OnWriteValue(obj, valueCopyer);
        }
Beispiel #8
0
        /// <summary>
        /// 写入一个对象结构数据。
        /// </summary>
        /// <param name="dataReader">对象结构数据读取器</param>
        public void WriteObject(IDataReader <string> dataReader)
        {
            var valueCopyer = new ValueCopyer();

            valueCopyer.WriteObject(dataReader);

            fieldRW.OnWriteValue(obj, valueCopyer);
        }
Beispiel #9
0
        /// <summary>
        /// 读取一个数组结构。
        /// </summary>
        /// <param name="valueWriter">数组结构写入器</param>
        public void ReadArray(IDataWriter <int> valueWriter)
        {
            var valueCopyer = new ValueCopyer();

            fieldRW.OnReadValue(obj, valueCopyer);

            valueCopyer.ReadArray(valueWriter);
        }
Beispiel #10
0
        private bool Filter(ValueCopyer valueCopyer)
        {
            var basicType = valueCopyer.TypeCode;

            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);
        }
Beispiel #11
0
        public void XSkipDefaultValueTest()
        {
            var rw = XObjectRW.Create <SkipDefaultValueTester>();



            rw.Initialize();

            rw.OnWriteAll(RWHelper.CreateReader(new Dictionary <string, object> {
                { "Id", 123 },
                { "Name", null }
            }).As <string>());

            IsTrue(
                ValueInterface <Dictionary <string, object> > .ReadValue(ValueCopyer.ValueOf(rw)) is Dictionary <string, object> dic1 &&
                dic1.Count == 1 &&
                (int)dic1["Id"] == 123
                );



            rw.Initialize();

            rw.OnWriteAll(RWHelper.CreateReader(new Dictionary <string, object> {
                { "Id", 0 },
                { "Name", "Dogwei" }
            }).As <string>());

            IsTrue(
                ValueInterface <Dictionary <string, object> > .ReadValue(ValueCopyer.ValueOf(rw)) is Dictionary <string, object> dic2 &&
                dic2.Count == 1 &&
                (string)dic2["Name"] == "Dogwei"
                );



            rw.Initialize();

            rw.OnWriteAll(RWHelper.CreateReader(new Dictionary <string, object> {
                { "Id", 0 },
                { "Name", null }
            }).As <string>());

            IsTrue(
                ValueInterface <Dictionary <string, object> > .ReadValue(ValueCopyer.ValueOf(rw)) is Dictionary <string, object> dic3 &&
                dic3.Count == 0
                );
        }
Beispiel #12
0
        /// <summary>
        /// 读取一个对象。
        /// </summary>
        /// <param name="valueWriter">对象写入器</param>
        public virtual void ReadObject(IDataWriter <string> valueWriter)
        {
            var obj = DirectRead();

            if (obj != null)
            {
                if (valueWriter.ContentType?.IsInstanceOfType(obj) == true)
                {
                    valueWriter.Content = obj;
                }
                else
                {
                    ValueCopyer.ValueOf(obj).ReadObject(valueWriter);
                }
            }
        }
Beispiel #13
0
        public void FastObjectTest()
        {
            var rw = FastObjectRW <ObjectTester> .Create();

            AreEqual(rw.content, null);

            AreEqual(rw.Count, 2);

            AreEqual(rw.ContentType, typeof(ObjectTester));

            rw.Initialize();

            AreNotEqual(rw.content, null);

            AreEqual(rw.content.Id, 0);
            AreEqual(rw.content.Name, null);

            rw["@id"].WriteInt32(123);
            rw["@name"].WriteString("Dogwei");

            AreEqual(rw.content.Id, 123);
            AreEqual(rw.content.Name, "Dogwei");

            AreEqual(rw["@id"].ReadInt32(), 123);
            AreEqual(rw["@name"].ReadString(), "Dogwei");

            IsTrue(
                ValueInterface <Dictionary <string, object> > .ReadValue(ValueCopyer.ValueOf(rw)) is Dictionary <string, object> dic &&
                dic.Count == 2 &&
                (int)dic["@id"] == 123 &&
                (string)dic["@name"] == "Dogwei"
                );

            rw[rw.GetOrdinal("@id")].WriteInt32(456);
            rw[rw.GetOrdinal("@name")].WriteString("Eway");

            AreEqual(rw[rw.GetOrdinal("@id")].ReadInt32(), 456);
            AreEqual(rw[rw.GetOrdinal("@name")].ReadString(), "Eway");
        }
Beispiel #14
0
 /// <summary>
 /// 初始化具有指定值的实例。
 /// </summary>
 /// <param name="key">键的值</param>
 /// <param name="type">值的类型</param>
 /// <param name="valueCopyer">值的读写器</param>
 public ValueFilterInfo(TKey key, Type type, ValueCopyer valueCopyer)
 {
     Key         = key;
     Type        = type;
     ValueCopyer = valueCopyer;
 }
Beispiel #15
0
        /// <summary>
        /// 将数据源中的所有成员的名称和值写入到数据写入器中。
        /// </summary>
        /// <param name="dataWriter">数据写入器</param>
        public void OnReadAll(IDataWriter <string> dataWriter)
        {
            if ((xTypeInfo.flags & XBindingFlags.RWMembersOptIn) != 0)
            {
                MembersOptIn();
            }
            else
            {
                None();
            }

            void MembersOptIn()
            {
                var vc     = new ValueCopyer();
                var fields = xTypeInfo.rwFields;

                for (int i = 0; i < fields.Count; i++)
                {
                    if (fields[i].Value is XAttributedFieldRW fieldRW && fieldRW.CanRead)
                    {
                        if (fieldRW.SkipDefaultValue)
                        {
                            fieldRW.OnReadValue(obj, vc);

                            if (!vc.IsEmptyValue())
                            {
                                vc.WriteTo(dataWriter[fieldRW.Name]);
                            }
                        }
                        else
                        {
                            fieldRW.OnReadValue(obj, dataWriter[fieldRW.Name]);
                        }
                    }
                }
            }

            void None()
            {
                var vc     = new ValueCopyer();
                var fields = xTypeInfo.rwFields;

                for (int i = 0; i < fields.Count; i++)
                {
                    var item = fields[i].Value;

                    if (item.CanRead)
                    {
                        if (item.SkipDefaultValue)
                        {
                            item.OnReadValue(obj, vc);

                            if (!vc.IsEmptyValue())
                            {
                                vc.WriteTo(dataWriter[item.Name]);
                            }
                        }
                        else
                        {
                            item.OnReadValue(obj, dataWriter[item.Name]);
                        }
                    }
                }
            }
        }
Beispiel #16
0
 /// <summary>
 /// 初始化默认实例。
 /// </summary>
 public ValueFilterInfo()
 {
     ValueCopyer = new ValueCopyer();
 }
Beispiel #17
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);
        }
Beispiel #18
0
 public object Convert(object value, Type type)
     => ValueInterface.ReadValue(ValueCopyer.ValueOf(value), type);
Beispiel #19
0
 public override Dictionary <string, object> GetObject()
 {
     return(ValueCopyer.ValueOf(new RandomValueReader(1218).FastReadObject <Device>()).ReadDictionary <string, object>());
 }
Beispiel #20
0
 public override DataTable GetObject()
 {
     return(ValueCopyer.ValueOf(new RandomValueReader(1218).ReadList <Device>()).ReadDataTable().IdentifyColumnTypes());
 }
Beispiel #21
0
        public void ReferencingTest()
        {
            var obj = new { Id = 123, Name = "Dogwei", Obj = (object)null };
            var arr = new object[2];

            arr[0] = new { Id = 123 };
            arr[1] = arr[0];

            RWHelper.CreateRW(obj).As <string>()["Obj"].DirectWrite(obj);

            AreEqual(
                JsonFormatter.SerializeObject(obj, JsonFormatterOptions.LoopReferencingNull),
                "{\"Id\":123,\"Name\":\"Dogwei\",\"Obj\":null}"
                );

            AreEqual(
                JsonFormatter.SerializeObject(obj, JsonFormatterOptions.MultiReferencingNull),
                "{\"Id\":123,\"Name\":\"Dogwei\",\"Obj\":null}"
                );

            AreEqual(
                JsonFormatter.SerializeObject(obj, JsonFormatterOptions.MultiReferencingReference),
                "{\"Id\":123,\"Name\":\"Dogwei\",\"Obj\":{\"$ref\":\"#\"}}"
                );

            Catch <JsonOutOfDepthException>(() => JsonFormatter.SerializeObject(obj));
            Catch <JsonLoopReferencingException>(() => JsonFormatter.SerializeObject(obj, JsonFormatterOptions.LoopReferencingException));

            AreEqual(
                JsonFormatter.SerializeObject(arr, JsonFormatterOptions.LoopReferencingNull),
                "[{\"Id\":123},{\"Id\":123}]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(arr, JsonFormatterOptions.MultiReferencingNull),
                "[{\"Id\":123},null]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(arr, JsonFormatterOptions.MultiReferencingReference),
                "[{\"Id\":123},{\"$ref\":\"#/0\"}]"
                );

            JsonFormatter.SerializeObject(arr);
            JsonFormatter.SerializeObject(arr, JsonFormatterOptions.LoopReferencingException);

            AreEqual(
                JsonFormatter.SerializeObject(ValueInterface <DataTable> .ReadValue(ValueCopyer.ValueOf(arr)), JsonFormatterOptions.MultiReferencingNull),
                "[{\"Id\":123},{\"Id\":123}]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(ValueInterface <DataTable> .ReadValue(ValueCopyer.ValueOf(arr)).CreateDataReader(), JsonFormatterOptions.MultiReferencingNull),
                "[{\"Id\":123},{\"Id\":123}]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(Enumerable.Range(0, 10), JsonFormatterOptions.MultiReferencingNull),
                "[0,1,2,3,4,5,6,7,8,9]"
                );

            var mar = new object[, ] {
                { arr[0], arr[0] }, { arr[0], arr[0] }
            };

            AreEqual(
                JsonFormatter.SerializeObject(mar, JsonFormatterOptions.LoopReferencingNull),
                "[[{\"Id\":123},{\"Id\":123}],[{\"Id\":123},{\"Id\":123}]]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(mar, JsonFormatterOptions.MultiReferencingNull),
                "[[{\"Id\":123},null],[null,null]]"
                );

            AreEqual(
                JsonFormatter.SerializeObject(mar, JsonFormatterOptions.MultiReferencingReference),
                "[[{\"Id\":123},{\"$ref\":\"#/0/0\"}],[{\"$ref\":\"#/0/0\"},{\"$ref\":\"#/0/0\"}]]"
                );

            JsonFormatter.SerializeObject(mar);
            JsonFormatter.SerializeObject(mar, JsonFormatterOptions.LoopReferencingException);

            var dic2 = JsonFormatter.DeserializeObject <object[]>("[{\"Id\":123},{\"$ref\":\"#/0\"}]");

            AreEqual(JsonFormatter.SerializeObject(dic2[1]), "{\"$ref\":\"#/0\"}");

            var mar2 = JsonFormatter.DeserializeObject <object[, ]>("[[{\"Id\":123},{\"$ref\":\"#/0/0\"}],[{\"$ref\":\"#/0/0\"},{\"$ref\":\"#/0/0\"}]]", JsonFormatterOptions.MultiReferencingReference);

            AreEqual(mar2[0, 0], mar2[0, 1]);
            AreEqual(mar2[1, 0], mar2[0, 1]);
            AreEqual(mar2[1, 0], mar2[1, 1]);
        }
Beispiel #22
0
        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;
                }
Beispiel #24
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);
        }
Beispiel #25
0
        /// <summary>
        /// 将数据源中的所有成员的名称和值写入到数据写入器中。
        /// </summary>
        /// <param name="dataWriter">数据写入器</param>
        public void OnReadAll(IDataWriter <string> dataWriter)
        {
            const XBindingFlags MembersOptInWithSkipDefaultValue = XBindingFlags.RWSkipDefaultValue | XBindingFlags.RWMembersOptIn;

            if ((xTypeInfo.flags & MembersOptInWithSkipDefaultValue) == MembersOptInWithSkipDefaultValue)
            {
                MembersOptIn_SkipDefaultValue();
            }
            else if ((xTypeInfo.flags & XBindingFlags.RWMembersOptIn) != 0)
            {
                MembersOptIn();
            }
            else if ((xTypeInfo.flags & XBindingFlags.RWSkipDefaultValue) != 0)
            {
                SkipDefaultValue();
            }
            else
            {
                None();
            }

            void MembersOptIn_SkipDefaultValue()
            {
                var valueCopyer = new ValueCopyer();

                foreach (var item in xTypeInfo.rwFields)
                {
                    if (item is XAttributedFieldRW fieldRW && fieldRW.CanRead)
                    {
                        fieldRW.OnReadValue(obj, valueCopyer);

                        if (!valueCopyer.IsEmptyValue())
                        {
                            valueCopyer.WriteTo(dataWriter[fieldRW.Name]);
                        }
                    }
                }
            }

            void MembersOptIn()
            {
                foreach (var item in xTypeInfo.rwFields)
                {
                    if (item is XAttributedFieldRW fieldRW && fieldRW.CanRead)
                    {
                        fieldRW.OnReadValue(obj, dataWriter[fieldRW.Name]);
                    }
                }
            }

            void SkipDefaultValue()
            {
                var valueCopyer = new ValueCopyer();

                foreach (var item in xTypeInfo.rwFields)
                {
                    if (item.CanRead)
                    {
                        item.OnReadValue(obj, valueCopyer);

                        if (!valueCopyer.IsEmptyValue())
                        {
                            valueCopyer.WriteTo(dataWriter[item.Name]);
                        }
                    }
                }
            }

            void None()
            {
                foreach (var item in xTypeInfo.rwFields)
                {
                    if (item.CanRead)
                    {
                        item.OnReadValue(obj, dataWriter[item.Name]);
                    }
                }
            }
        }