/// <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("\""); }
public void Write(ISerializerWriter writer, JsonSerializeSetting setting, InvestModel model, byte level) { writer.Write("{"); writer.Write("Amount:"); writer.Write(model.Amount.ToString()); writer.Write("}"); }
/// <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()); }
/// <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; }
/// <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; }
/// <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)); } }
/// <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); }
/// <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"); }
/// <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"); }
/// <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; }
/// <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); }
/// <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); }
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; }
/// <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; }
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()); }
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; }
/// <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); }
/// <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; }