/// <summary>
        /// 从对象中写入流中
        /// </summary>
        /// <param name="writer">写入流</param>
        /// <param name="setting">配置项</param>
        /// <param name="source">源数据</param>
        public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, Nullable <T> source)
        {
            if (source.HasValue)
            {
                if (setting.WriteNumberOnEnumType)
                {
                    if (setting.WriteQuoteWhenObjectIsNumber)
                    {
                        writer.Write("\"");
                        MethodProviders.EnumMethodProvider <T> .Default.Write(writer, setting, source.Value);

                        writer.Write("\"");
                    }
                    else
                    {
                        MethodProviders.EnumMethodProvider <T> .Default.Write(writer, setting, source.Value);
                    }
                }
                else
                {
                    writer.Write("\"");
                    MethodProviders.EnumMethodProvider <T> .Default.Write(writer, setting, source.Value);

                    writer.Write("\"");
                }

                return;
            }

            writer.Write("null");
        }
        /// <summary>
        /// 从对象中写入流中
        /// </summary>
        /// <param name="writer">写入流</param>
        /// <param name="setting">配置项</param>
        /// <param name="source">源数据</param>
        public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, string source)
        {
            /*要进行转义的*/
            if (source == null)
            {
                if (setting.WriteNullWhenObjectIsNull)
                {
                    writer.Write("null");
                }
                else
                {
                    writer.Write("\"\"");
                }
                return;
            }
            else if (source.Length == 0)
            {
                writer.Write("\"\"");
                return;
            }

            writer.Write("\"");
            for (var i = 0; i < source.Length; i++)
            {
                CharMethodProvider.Default.Write(writer, setting, source[i]);
            }
            writer.Write("\"");
        }
Beispiel #3
0
 public void Write(ISerializerWriter writer, JsonSerializeSetting setting, InvestModel model, byte level)
 {
     writer.Write("{");
     writer.Write("Amount:");
     writer.Write(model.Amount.ToString());
     writer.Write("}");
 }
Beispiel #4
0
        /// <summary>
        /// 写入流中
        /// </summary>
        /// <param name="writer">The writer.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="level"></param>
        /// <param name="array">The array.</param>
        public virtual void Write(ISerializerWriter writer, JsonSerializeSetting setting, byte level, IEnumerable array)
        {
            if (array == null)
            {
                if (setting.WriteNullWhenObjectIsNull)
                {
                    writer.Write("null");
                }
                else
                {
                    writer.Write("[]");
                }

                return;
            }

            writer.Write("[");
            var  enumerator = array.GetEnumerator();
            bool moveNext   = enumerator.MoveNext();

            while (moveNext)
            {
                var item = enumerator.Current;
                SerialierBuilderHelper.QueryBuilderInvoker(item.GetType())(writer, setting, item, level++);
                if (moveNext = enumerator.MoveNext())
                {
                    writer.Write(",");
                }
            }
            writer.Write("]");
            return;
        }
        private void TestJsonTextWriterProperties(TestClass instance, string context,
                                                  JsonSerializeSetting setting = null)
        {
            string xmlContext     = DivideXml(instance.GetType(), null, instance, setting);
            string convertContext = Convert(xmlContext);

            StringBuilder sb         = new StringBuilder();
            Serializer    serializer = new Serializer(typeof(TestClass));

            using (ExtentedStringWriter strWriter = new ExtentedStringWriter(sb, new UTF8Encoding(false)))
            {
                using (JsonTextWriter writer = new JsonTextWriter(strWriter))
                {
                    if (setting != null)
                    {
                        writer.Setting = setting;
                    }
                    serializer.Divide(writer, null, instance);
                }
            }
            DebugWriteLine(sb.ToString());
            Assert.AreEqual(context, sb.ToString());

            TestClass newInstance = CombineJson <TestClass>(sb.ToString(), null, setting);

            Assert.IsTrue(string.Equals(instance.Str, newInstance.Str, StringComparison.Ordinal));
            Assert.IsTrue(decimal.Equals(instance.Number, newInstance.Number));
            Assert.IsTrue(DateTime.Equals(instance.DT.ToUniversalTime(), newInstance.DT.ToUniversalTime()));
        }
        /// <summary>
        /// 从对象中写入流中
        /// </summary>
        /// <param name="writer">写入流</param>
        /// <param name="setting">配置项</param>
        /// <param name="source">源数据</param>
        public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, bool?source)
        {
            if (source.HasValue)
            {
                if (setting.WriteNumberOnBoolenType)
                {
                    if (setting.WriteQuoteWhenObjectIsNumber)
                    {
                        writer.Write("\"");
                        MethodProviders.BooleanMethodProvider.Default.Write(writer, setting, source.Value);
                        writer.Write("\"");
                    }
                    else
                    {
                        MethodProviders.BooleanMethodProvider.Default.Write(writer, setting, source.Value);
                    }
                }
                else
                {
                    writer.Write("\"");
                    MethodProviders.BooleanMethodProvider.Default.Write(writer, setting, source.Value);
                    writer.Write("\"");
                }

                return;
            }

            writer.Write("null");
        }
 /// <summary>
 /// 序列化对象
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="object">源对象</param>
 /// <param name="setting">配置</param>
 /// <returns></returns>
 public static string Serialize <T>(T @object, JsonSerializeSetting setting)
 {
     var writer = new ThunderWriter();
     {
         Serialize(@object, setting, writer);
         return(writer.ToString());
     }
 }
        /// <summary>
        /// 进行构建
        /// </summary>
        /// <returns></returns>
        public Func <T, string> Build(JsonSerializeSetting setting)
        {
            if (setting.WriteNumberOnEnumType)
            {
                return(Enum.GetUnderlyingType(this.TargetType) == typeof(ulong) ? this.BuildWithNumberForULong() : this.BuildWithNumberForLong());
            }

            return(Enum.GetUnderlyingType(this.TargetType) == typeof(ulong) ? this.BuildForULong() : this.BuildForLong());
        }
Beispiel #9
0
        /// <summary>
        /// 写入流中
        /// </summary>
        /// <param name="writer">The writer.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="level"></param>
        /// <param name="array">The array.</param>
        public virtual void WriteObjectValue(ISerializerWriter writer, JsonSerializeSetting setting, byte level, IDictionary <Key, object> array)
        {
            if (array == null)
            {
                if (setting.WriteNullWhenObjectIsNull)
                {
                    writer.Write("null");
                }
                else
                {
                    writer.Write("{}");
                }

                return;
            }

            if (array.Count == 0)
            {
                writer.Write("{}");
                return;
            }

            writer.Write("{");
            var i = -1;

            foreach (var a in array)
            {
                i++;
                ZzzZzSerialierBuilder <Key> .Register(setting).Invoke(writer, setting, a.Key, level++);

                writer.Write(":");

                if (a.Value == null)
                {
                    if (setting.WriteNullWhenObjectIsNull)
                    {
                        writer.Write("null");
                    }
                    else
                    {
                        writer.Write("{}");
                    }
                }
                else
                {
                    SerialierBuilderHelper.QueryBuilderInvoker(a.Value.GetType()).Invoke(writer, setting, a.Value, level++);
                }

                if (i < array.Count - 1)
                {
                    writer.Write(",");
                }
            }

            writer.Write("}");
            return;
        }
Beispiel #10
0
        /// <summary>
        /// 执行builder,反射用到的
        /// </summary>
        /// <param name="writer">The writer.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="level"></param>
        /// <param name="source">The source.</param>
        internal static void CallObjectBuilderInvoke(ISerializerWriter writer, JsonSerializeSetting setting, object source, byte level)
        {
            if (source == null)
            {
                writer.Write("null");
                return;
            }

            QueryBuilderInvoker(source.GetType()).Invoke(writer, setting, source, level++);
        }
        /// <summary>
        /// 从对象中写入流中
        /// </summary>
        /// <param name="writer">写入流</param>
        /// <param name="setting">配置项</param>
        /// <param name="source"></param>
        public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, DateTime source)
        {
            char[] buffer = null;
            buffer = new char[24];
            var item = ZeroToHundred[source.Year % 100];

            buffer[2] = item.Key;
            buffer[3] = item.Value;
            item      = ZeroToHundred[source.Year / 100];
            buffer[0] = item.Key;
            buffer[1] = item.Value;

            buffer[4] = '-';

            item      = ZeroToHundred[source.Month];
            buffer[5] = item.Key;
            buffer[6] = item.Value;

            buffer[7] = '-';

            item      = ZeroToHundred[source.Day];
            buffer[8] = item.Key;
            buffer[9] = item.Value;

            buffer[10] = 'T';

            item       = ZeroToHundred[source.Hour];
            buffer[11] = item.Key;
            buffer[12] = item.Value;

            buffer[13] = ':';

            item       = ZeroToHundred[source.Minute];
            buffer[14] = item.Key;
            buffer[15] = item.Value;

            buffer[16] = ':';

            item       = ZeroToHundred[source.Second];
            buffer[17] = item.Key;
            buffer[18] = item.Value;

            buffer[19] = '.';

            item       = ZeroToHundred[source.Millisecond % 100];
            buffer[20] = item.Key;
            buffer[21] = item.Value;
            item       = ZeroToHundred[source.Millisecond / 100];
            buffer[22] = item.Key;
            buffer[23] = 'Z';

            writer.Write(buffer);
            return;
        }
Beispiel #12
0
 /// <summary>
 /// 从对象中写入流中
 /// </summary>
 /// <param name="writer">写入流</param>
 /// <param name="setting">配置项</param>
 /// <param name="source">源数据</param>
 public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, Type source)
 {
     if (setting.WriteVersionOnTypeInfo)
     {
         writer.Write(source.AssemblyQualifiedName);
     }
     else
     {
         writer.Write(Regex.Replace(source.AssemblyQualifiedName, "\\s+version=(.*?),", "", RegexOptions.IgnoreCase));
     }
 }
Beispiel #13
0
        /// <summary>
        /// 从对象中写入流中
        /// </summary>
        /// <param name="writer">写入流</param>
        /// <param name="setting">配置项</param>
        /// <param name="source">源数据</param>
        public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, long source)
        {
            if (source == long.MinValue)
            {
                writer.Write("-9223372036854775808");
                return;
            }

            if (source == long.MaxValue)
            {
                writer.Write("9223372036854775807");
                return;
            }

            var target = source;

            if (source < 0)
            {
                writer.Write('-');
                target = -target;
            }

            char[] buffer = null;
            /*long的最大长度为19,加一个负数符号*/
            var maxlength = "9223372036854775807".Length;

            buffer = new char[maxlength + 1];
            var lessen = 0L;
            KeyValuePair <char, char> item;

            do
            {
                lessen                = target % 100;
                item                  = ZeroToHundred[lessen];
                buffer[maxlength]     = item.Value;
                buffer[maxlength - 1] = item.Key;
                maxlength            -= 2;
                target                = (target / 100);
            } while (target != 0);

            if (item.Key == '0')
            {
                writer.Write(buffer, maxlength + 2);
                return;
            }

            writer.Write(buffer, maxlength + 1);
            return;

            //var digitlength = GetDigitLength(source);
            //buffer = new char[digitlength];
            //WriteIntoChar(buffer, source, digitlength, 0);
            //writer.Write(buffer);
        }
Beispiel #14
0
        /// <summary>
        /// 从对象中写入流中
        /// </summary>
        /// <param name="writer">写入流</param>
        /// <param name="setting">配置项</param>
        /// <param name="source">源数据</param>
        public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, TimeSpan?source)
        {
            if (source.HasValue)
            {
                writer.Write("\"");
                MethodProviders.TimeSpanMethodProvider.Default.Write(writer, setting, source.Value);
                writer.Write("\"");
                return;
            }

            writer.Write("null");
        }
Beispiel #15
0
        /// <summary>
        /// 序列化对象
        /// </summary>
        /// <param name="object">源对象</param>
        /// <param name="setting">配置</param>
        /// <param name="writer">写入流</param>
        /// <returns></returns>
        private static void Serialize(object @object, JsonSerializeSetting setting, ISerializerWriter writer)
        {
            if (@object == null)
            {
                writer.Write("null");
                return;
            }

            var @delegate = SerialierBuilderHelper.QueryBuilderInvoker(@object.GetType());

            @delegate(writer, setting, @object, 0);
        }
        /// <summary>
        /// 从对象中写入流中
        /// </summary>
        /// <param name="writer">写入流</param>
        /// <param name="setting">配置项</param>
        /// <param name="source">源数据</param>
        public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, DateTime?source)
        {
            if (source.HasValue)
            {
                writer.Write("\"");
                MethodProviders.DateTimes.ChineseStyleDateMethodProvider.Default.Write(writer, setting, source.Value);
                writer.Write("\"");
                return;
            }

            writer.Write("null");
        }
Beispiel #17
0
 /// <summary>
 /// 从对象中写入流中
 /// </summary>
 /// <param name="writer">写入流</param>
 /// <param name="setting">配置项</param>
 /// <param name="source">源数据</param>
 public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, bool source)
 {
     if (setting.WriteNumberOnBoolenType)
     {
         writer.Write(source ? "1" : "0");
     }
     else
     {
         writer.Write(source ? "true" : "false");
     }
     return;
 }
Beispiel #18
0
        /// <summary>
        /// 从对象中写入流中
        /// </summary>
        /// <param name="writer">写入流</param>
        /// <param name="setting">配置项</param>
        /// <param name="source">源数据</param>
        public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, byte source)
        {
            char[] buffer = new char[3];
            var    it     = ZeroToHundred[source % 100];

            buffer[2] = it.Value;
            buffer[1] = it.Key;
            if (source < 10)
            {
                writer.Write(buffer, 2);
                return;
            }
            if (source < 100)
            {
                writer.Write(buffer, 1);
                return;
            }

            buffer[0] = ZeroToHundred[source / 100].Value;
            writer.Write(buffer);
            return;

            //char[] buffer = null;
            /*ushort的最大长度为5*/
            //var maxlength = "255".Length;
            //buffer = new char[maxlength + 1];
            //byte lessen = 0;
            //Tuple<char, char> item;
            //do
            //{
            //    lessen = (byte)(source % 100);
            //    item = ZeroToHundred[lessen];
            //    buffer[maxlength] = item.Item2;
            //    buffer[maxlength - 1] = item.Item1;
            //    maxlength -= 2;
            //    source = (byte)(source / 100);
            //} while (source != 0);

            //if (item.Item1 == '0')
            //{
            //    writer.Write(buffer, maxlength + 2);
            //    return;
            //}

            //writer.Write(buffer, maxlength + 1);
            //return;

            //var digitlength = GetDigitLength(source);
            //buffer = new char[digitlength];
            //WriteIntoChar(buffer, source, digitlength, 0);
            //writer.Write(buffer);
        }
Beispiel #19
0
        /// <summary>
        /// 序列化对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="object">源对象</param>
        /// <param name="setting">配置</param>
        /// <param name="writer">写入流</param>
        /// <returns></returns>
        private static void Serialize <T>(T @object, JsonSerializeSetting setting, ISerializerWriter writer)
        {
            /*object*/
            if (typeof(T) == typeof(object))
            {
                Serialize((object)@object, setting, writer);
                return;
            }

            var build = ZzzZzSerialierBuilder <T> .Register(setting);

            build(writer, setting, @object, 0);
        }
Beispiel #20
0
        public void TestClone()
        {
            JsonSerializeSetting c = new JsonSerializeSetting();

            c.IgnoreAttributeType = typeof(string);
            c.SAIN       = new Random().Next(Int32.MinValue, Int32.MaxValue).ToString();
            c.ActionName = new Random().Next(Int32.MinValue, Int32.MaxValue).ToString();
#if NET_40_UP || NETSTANDARD_2_0_UP
            c.AssemblyQualifiedName = new Random().Next(Int32.MinValue, Int32.MaxValue).ToString();
#endif
#if NET || NETSTANDARD_2_0_UP
            c.EnableOnDeserializedAttribute  = !c.EnableOnDeserializedAttribute;
            c.EnableOnDeserializingAttribute = !c.EnableOnDeserializingAttribute;
            c.EnableOnSerializedAttribute    = !c.EnableOnSerializedAttribute;
            c.EnableOnSerializingAttribute   = !c.EnableOnSerializingAttribute;
#endif
            foreach (string name in Enum.GetNames(typeof(SerializeMemberType)))
            {
                SerializeMemberType t = (SerializeMemberType)Enum.Parse(typeof(SerializeMemberType), name);
                if (c.MemberType != t)
                {
                    c.MemberType = t;
                }
            }
            foreach (string name in Enum.GetNames(typeof(DateTimeSerializationMode)))
            {
                DateTimeSerializationMode t =
                    (DateTimeSerializationMode)Enum.Parse(typeof(DateTimeSerializationMode), name);
                if (c.Mode != t)
                {
                    c.Mode = t;
                }
            }
            foreach (string name in Enum.GetNames(typeof(SerializeMemberModifier)))
            {
                SerializeMemberModifier t = (SerializeMemberModifier)Enum.Parse(typeof(SerializeMemberModifier), name);
                if (c.Modifier != t)
                {
                    c.Modifier = t;
                }
            }
            c.SerializeDefalutValue = !c.SerializeDefalutValue;
            c.ActionName            = new Random().Next(Int32.MinValue, Int32.MaxValue).ToString();

            JsonSerializeSetting c_new = c.Clone() as JsonSerializeSetting;
            PropertyInfo[]       pis   = typeof(JsonSerializeSetting).GetProperties();
            foreach (PropertyInfo pi in pis)
            {
                Assert.AreEqual(pi.GetValue(c, null), pi.GetValue(c_new, null));
            }
        }
        /// <summary>
        /// 写入流中
        /// </summary>
        /// <param name="writer">The writer.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="array">The array.</param>
        public virtual void WriteString(ISerializerWriter writer, JsonSerializeSetting setting, IEnumerable <T> array)
        {
            if (array == null)
            {
                if (setting.WriteNullWhenObjectIsNull)
                {
                    writer.Write("null");
                }
                else
                {
                    writer.Write("[]");
                }

                return;
            }

            var provider = this.MethodProvider;
            var list     = array as IList <T>;

            if (list != null)
            {
                writer.Write("[");
                for (var i = 0; i < list.Count; i++)
                {
                    provider.Write(writer, setting, list[i]);
                    if (i < list.Count - 1)
                    {
                        writer.Write(",");
                    }
                }
                writer.Write("]");
                return;
            }

            writer.Write("[");
            var enumerator = array.GetEnumerator();

            if (enumerator.MoveNext())
            {
                provider.Write(writer, setting, enumerator.Current);
            }

            while (enumerator.MoveNext())
            {
                writer.Write(",");
                provider.Write(writer, setting, enumerator.Current);
            }

            writer.Write("]");
            return;
        }
Beispiel #22
0
        /// <summary>
        /// 写入流中
        /// </summary>
        /// <param name="writer">The writer.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="level"></param>
        /// <param name="array">The array.</param>
        public virtual void Write(ISerializerWriter writer, JsonSerializeSetting setting, byte level, IEnumerable <T> array)
        {
            if (array == null)
            {
                if (setting.WriteNullWhenObjectIsNull)
                {
                    writer.Write("null");
                }
                else
                {
                    writer.Write("[]");
                }

                return;
            }

            var list = array as IList <T>;

            if (list != null)
            {
                writer.Write("[");
                for (var i = 0; i < list.Count; i++)
                {
                    ZzzZzSerialierBuilder <T> .Register(setting).Invoke(writer, setting, list[i], level++);

                    if (i < list.Count - 1)
                    {
                        writer.Write(",");
                    }
                }
                writer.Write("]");
                return;
            }

            writer.Write("[");
            var enumerator = array.GetEnumerator();

            if (enumerator.MoveNext())
            {
                ZzzZzSerialierBuilder <T> .Register(setting).Invoke(writer, setting, enumerator.Current, level++);
            }
            while (enumerator.MoveNext())
            {
                writer.Write(",");
                ZzzZzSerialierBuilder <T> .Register(setting).Invoke(writer, setting, enumerator.Current, level++);
            }
            writer.Write("]");
            return;
        }
Beispiel #23
0
        protected T CombineJson <T>(string context, object oriValue, JsonSerializeSetting setting = null,
                                    bool createnew = true)
        {
            Serializer serializer = new Serializer(typeof(T));

            using (StringReader sr = new StringReader(context))
            {
                using (JsonTextReader jsonReader = new JsonTextReader(sr))
                {
                    if (setting != null)
                    {
                        jsonReader.Setting = setting;
                    }
                    return((T)serializer.Combine(jsonReader, oriValue, !createnew));
                }
            }
        }
        /// <summary>
        /// 进行构建
        /// </summary>
        /// <returns></returns>
        public static Func <T, string> Register(JsonSerializeSetting setting)
        {
            if (function != null)
            {
                return(function);
            }

            lock (locker)
            {
                if (function != null)
                {
                    return(function);
                }

                function = new EnumSerializerBuilder <T>().Build(setting);
                return(function);
            }
        }
        /// <summary>
        /// 进行构建
        /// </summary>
        public Action <ISerializerWriter, JsonSerializeSetting, T, byte> Build(JsonSerializeSetting setting)
        {
            var emit = EasyEmitBuilder <Action <ISerializerWriter, JsonSerializeSetting, T, byte> > .NewDynamicMethod();

            if (!IsComplexType(this.TargetType) || this.IsType(this.TargetType) || this.IsAssignableFrom(this.TargetType, typeof(Exception)))
            {
                this.BuildNotCepaType(emit, setting, this.TargetType);
                emit.Return();
                return(emit.CreateDelegate());
            }

            //this.WriteObjectFrontSigil(emit);
            this.Build(emit, setting);
            // this.WriteObjectLastSigil(emit);

            emit.Return();
            return(emit.CreateDelegate());
        }
Beispiel #26
0
        protected string DivideXml(Type t, object oriValue, object revValue, JsonSerializeSetting setting = null)
        {
            Serializer    serializer = new Serializer(t);
            StringBuilder result     = new StringBuilder();

            using (ExtentedStringWriter sw = new ExtentedStringWriter(result, new UTF8Encoding(false)))
            {
                using (XmlTextWriter xmlWriter = new XmlTextWriter(sw))
                {
                    if (setting != null)
                    {
                        xmlWriter.Setting = setting;
                    }
                    serializer.Divide(xmlWriter, oriValue, revValue);
                }
            }
            DebugWriteLine(result.ToString());
            return(result.ToString());
        }
        /// <summary>
        /// 写入流中
        /// </summary>
        /// <param name="writer">The writer.</param>
        /// <param name="setting">The setting.</param>
        /// <param name="level"></param>
        /// <param name="array">The array.</param>
        public virtual void Write(ISerializerWriter writer, JsonSerializeSetting setting, byte level, IDictionary array)
        {
            if (array == null)
            {
                if (setting.WriteNullWhenObjectIsNull)
                {
                    writer.Write("null");
                }
                else
                {
                    writer.Write("{}");
                }

                return;
            }

            if (array.Count == 0)
            {
                writer.Write("{}");
                return;
            }

            writer.Write("{");

            var  enumerator = array.Keys.GetEnumerator();
            bool moveNext   = enumerator.MoveNext();

            while (moveNext)
            {
                SerialierBuilderHelper.QueryBuilderInvoker(enumerator.Current.GetType())(writer, setting, enumerator.Current, level++);
                writer.Write(":");
                var item = array[enumerator.Current];
                SerialierBuilderHelper.QueryBuilderInvoker(item.GetType())(writer, setting, item, level++);
                if (moveNext = enumerator.MoveNext())
                {
                    writer.Write(",");
                }
            }

            writer.Write("}");
            return;
        }
Beispiel #28
0
        /// <summary>
        /// 从对象中写入流中
        /// </summary>
        /// <param name="writer">写入流</param>
        /// <param name="setting">配置项</param>
        /// <param name="source">源数据</param>
        public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, ushort?source)
        {
            if (source.HasValue)
            {
                if (setting.WriteQuoteWhenObjectIsNumber)
                {
                    writer.Write("\"");
                    MethodProviders.UInt16MethodProvider.Default.Write(writer, setting, source.Value);
                    writer.Write("\"");
                }
                else
                {
                    MethodProviders.UInt16MethodProvider.Default.Write(writer, setting, source.Value);
                }

                return;
            }

            writer.Write("null");
        }
        public static void Write(ISerializerWriter writer, JsonSerializeSetting setting, DateTime source)
        {
            if (DateTimeFormat.Default.Equals(setting.DateTimeFormat))
            {
                ISO8601StyleDateMethodProvider.Default.Write(writer, setting, source);
                return;
            }

            if (DateTimeFormat.ChineseStyle.Equals(setting.DateTimeFormat))
            {
                ChineseStyleDateMethodProvider.Default.Write(writer, setting, source);
                return;
            }

            if (DateTimeFormat.ISO8601Style.Equals(setting.DateTimeFormat))
            {
                ISO8601StyleDateMethodProvider.Default.Write(writer, setting, source);
                return;
            }

            if (DateTimeFormat.MicrosoftStyle.Equals(setting.DateTimeFormat))
            {
                MicrosoftStyleDateMethodProvider.Default.Write(writer, setting, source);
                return;
            }

            if (DateTimeFormat.RFC1123Style.Equals(setting.DateTimeFormat))
            {
                RFC1123StyleDateMethodProvider.Default.Write(writer, setting, source);
                return;
            }

            IConvertMethodProvider <DateTime> customMethodProvider = CustomSerializationProvider.QueryCustomDatetimeFormat(setting.DateTimeFormat) as IConvertMethodProvider <DateTime>;

            if (customMethodProvider == null)
            {
                throw new ArgumentException("format is not defined");
            }

            customMethodProvider.Write(writer, setting, source);
        }
Beispiel #30
0
        /// <summary>
        /// 从对象中写入流中
        /// </summary>
        /// <param name="writer">写入流</param>
        /// <param name="setting">配置项</param>
        /// <param name="source">源数据</param>
        public override void Write(ISerializerWriter writer, JsonSerializeSetting setting, ulong source)
        {
            if (source == ulong.MinValue)
            {
                writer.Write("0");
                return;
            }

            if (source == ulong.MaxValue)
            {
                writer.Write("18446744073709551615");
                return;
            }

            char[] buffer = null;
            /*ushort的最大长度为10*/
            var maxlength = "18446744073709551615".Length;

            buffer = new char[maxlength + 1];
            ulong lessen = 0;
            KeyValuePair <char, char> item;

            do
            {
                lessen                = source % 100;
                item                  = ZeroToHundred[lessen];
                buffer[maxlength]     = item.Value;
                buffer[maxlength - 1] = item.Key;
                maxlength            -= 2;
                source                = source / 100;
            } while (source != 0);

            if (item.Key == '0')
            {
                writer.Write(buffer, maxlength + 2);
                return;
            }

            writer.Write(buffer, maxlength + 1);
            return;
        }