public static unsafe void Main() { var obj = new Demo(); var json = "{Id:999,Name:Dogwei}"; var jsonFormatter = new JsonFormatter(); jsonFormatter.DeserializeTo(json, obj); Console.WriteLine(jsonFormatter.Serialize(obj)); while (true) { var stopwatch = Stopwatch.StartNew(); for (int i = 0; i < 1000000; i++) { var fast = FastObjectRW <Demo> .Create(); fast.Initialize(obj); jsonFormatter.DeserializeTo(json, fast); } Console.WriteLine(stopwatch.ElapsedMilliseconds); } }
public void FastSkipDefaultValueTest() { var rw = FastObjectRW <SkipDefaultValueTester> .Create(); 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 ); }
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"); }
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 void FastIgnoreCaseTest() { var chars = stackalloc char[100]; var bytes = stackalloc byte[100]; var rw = FastObjectRW <IgnoreCaseTester> .Create(); AreEqual(FastObjectRW <IgnoreCaseTester> .CurrentOptions & FastObjectRWOptions.IgnoreCase, FastObjectRWOptions.IgnoreCase); rw.Initialize(); rw["name"].WriteString("low"); AreEqual(rw["Name"].ReadString(), "low"); rw["NAME"].WriteString("upp"); AreEqual(rw["Name"].ReadString(), "upp"); Catch <MissingMemberException>(() => rw["EMAN"].WriteString("err")); Catch <MissingMemberException>(() => rw["eman"].ReadString()); Catch <MemberAccessException>(() => rw["READONLY"].WriteString("err")); rw["readonly"].ReadString(); rw["WRITEONLY"].WriteString("err"); Catch <MemberAccessException>(() => rw["writeonly"].ReadString()); rw[ToUtf16s("name")].WriteString("low"); AreEqual(rw[ToUtf16s("Name")].ReadString(), "low"); rw[ToUtf16s("NAME")].WriteString("upp"); AreEqual(rw[ToUtf16s("Name")].ReadString(), "upp"); Catch <MissingMemberException>(() => rw[ToUtf16s("EMAN")].WriteString("err")); Catch <MissingMemberException>(() => rw[ToUtf16s("eman")].ReadString()); Catch <MemberAccessException>(() => rw[ToUtf8s("READONLY")].WriteString("err")); rw[ToUtf8s("readonly")].ReadString(); rw[ToUtf8s("WRITEONLY")].WriteString("err"); Catch <MemberAccessException>(() => rw[ToUtf8s("writeonly")].ReadString()); rw[ToUtf8s("name")].WriteString("low"); AreEqual(rw[ToUtf8s("Name")].ReadString(), "low"); rw[ToUtf8s("NAME")].WriteString("upp"); AreEqual(rw[ToUtf8s("Name")].ReadString(), "upp"); Catch <MissingMemberException>(() => rw[ToUtf8s("EMAN")].WriteString("err")); Catch <MissingMemberException>(() => rw[ToUtf8s("eman")].ReadString()); Catch <MemberAccessException>(() => rw[ToUtf8s("READONLY")].WriteString("err")); rw[ToUtf8s("readonly")].ReadString(); rw[ToUtf8s("WRITEONLY")].WriteString("err"); Catch <MemberAccessException>(() => rw[ToUtf8s("writeonly")].ReadString()); var nicrw = FastObjectRW <NoIgnoreCaseTester> .Create(); AreEqual(FastObjectRW <NoIgnoreCaseTester> .CurrentOptions & FastObjectRWOptions.IgnoreCase, default(FastObjectRWOptions)); nicrw.Initialize(); nicrw["Name"].WriteString("ok"); Catch <MissingMemberException>(() => nicrw["name"].WriteString("err")); Catch <MissingMemberException>(() => nicrw["NAME"].WriteString("err")); nicrw[ToUtf16s("Name")].WriteString("ok"); Catch <MissingMemberException>(() => nicrw[ToUtf16s("name")].WriteString("err")); Catch <MissingMemberException>(() => nicrw[ToUtf16s("NAME")].WriteString("err")); nicrw[ToUtf8s("Name")].WriteString("ok"); Catch <MissingMemberException>(() => nicrw[ToUtf8s("name")].WriteString("err")); Catch <MissingMemberException>(() => nicrw[ToUtf8s("NAME")].WriteString("err")); Ps <char> ToUtf16s(string str) { Underlying.CopyBlock( ref Underlying.As <char, byte>(ref *chars), ref Underlying.As <char, byte>(ref StringHelper.GetRawStringData(str)), (uint)(str.Length * sizeof(char)) ); return(new Ps <char>(chars, str.Length)); } Ps <Utf8Byte> ToUtf8s(string str) { var length = StringHelper.GetUtf8Bytes(ref StringHelper.GetRawStringData(str), str.Length, bytes); return(new Ps <Utf8Byte>((Utf8Byte *)bytes, length)); } }