Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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
                );
        }
Exemple #3
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;
                }
Exemple #5
0
        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));
            }
        }