/// <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]); } } }
/// <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(); }
/// <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(); }
/// <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(); }
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" ); }
/// <summary> /// 读取一个对象结构数据。 /// </summary> /// <param name="valueWriter">对象结构数据写入器</param> public void ReadObject(IDataWriter <string> valueWriter) { var valueCopyer = new ValueCopyer(); fieldRW.OnReadValue(obj, valueCopyer); valueCopyer.ReadObject(valueWriter); }
/// <summary> /// 写入一个数组结构数据。 /// </summary> /// <param name="dataReader">数组结构数据读取器</param> public void WriteArray(IDataReader <int> dataReader) { var valueCopyer = new ValueCopyer(); valueCopyer.WriteArray(dataReader); fieldRW.OnWriteValue(obj, valueCopyer); }
/// <summary> /// 写入一个对象结构数据。 /// </summary> /// <param name="dataReader">对象结构数据读取器</param> public void WriteObject(IDataReader <string> dataReader) { var valueCopyer = new ValueCopyer(); valueCopyer.WriteObject(dataReader); fieldRW.OnWriteValue(obj, valueCopyer); }
/// <summary> /// 读取一个数组结构。 /// </summary> /// <param name="valueWriter">数组结构写入器</param> public void ReadArray(IDataWriter <int> valueWriter) { var valueCopyer = new ValueCopyer(); fieldRW.OnReadValue(obj, valueCopyer); valueCopyer.ReadArray(valueWriter); }
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); }
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 ); }
/// <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); } } }
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"); }
/// <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; }
/// <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]); } } } } }
/// <summary> /// 初始化默认实例。 /// </summary> public ValueFilterInfo() { ValueCopyer = new ValueCopyer(); }
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); }
public object Convert(object value, Type type) => ValueInterface.ReadValue(ValueCopyer.ValueOf(value), type);
public override Dictionary <string, object> GetObject() { return(ValueCopyer.ValueOf(new RandomValueReader(1218).FastReadObject <Device>()).ReadDictionary <string, object>()); }
public override DataTable GetObject() { return(ValueCopyer.ValueOf(new RandomValueReader(1218).ReadList <Device>()).ReadDataTable().IdentifyColumnTypes()); }
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]); }
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; }
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); }
/// <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]); } } } }