源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C#简单快速的json组件fastJSON使用介绍

  • 时间:2020-11-19 18:50 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C#简单快速的json组件fastJSON使用介绍
JSON数据格式简洁,用于数据的持久化和对象传输很实用。最近在做一个Razor代码生成器,需要把数据库的表和列的信息修改后保存下来,想到用JSON序列化对象并保存,需要时再反序列化成对象会简单一些。codeplex上发现了fastJSON项目,好像很不错的样子。这里是作者做的性能测试: [img]http://files.jb51.net/file_images/article/201211/20121119113916122.png[/img] 代码调用
[u]复制代码[/u] 代码如下:
namespace test { class Program { static void Main(string[] args) { var zoo1 = new zoo(); zoo1.animals = new List<animal>(); zoo1.animals.Add(new cat() { Name = "hello kitty", legs = 4 }); zoo1.animals.Add(new dog() { Name = "dog1", tail = true }); string json= fastJSON.JSON.Instance.ToJSON(zoo1); //序列化 var z = fastJSON.JSON.Instance.ToObject<zoo>(json); //反序列化 Console.WriteLine(z.animals[0].Name); Console.Read(); } } public class animal { public string Name { get; set; } } public class cat : animal { public int legs { get; set; } } public class dog : animal { public bool tail { get; set; } } public class zoo { public List<animal> animals { get; set; } }
基本的调用就是这么简单! 需要注意的是要反序列化的类好像必须声明为public的。 [b]快速的秘密[/b] 大体浏览了一下代码,发现之所以快速的原因是作者利用反射时Emit了大量的IL代码:
[u]复制代码[/u] 代码如下:
internal object FastCreateInstance(Type objtype) { try { CreateObject c = null; if (_constrcache.TryGetValue(objtype, out c)) { return c(); } else { if (objtype.IsClass) { DynamicMethod dynMethod = new DynamicMethod("_", objtype, null); ILGenerator ilGen = dynMethod.GetILGenerator(); ilGen.Emit(OpCodes.Newobj, objtype.GetConstructor(Type.EmptyTypes)); ilGen.Emit(OpCodes.Ret); c = (CreateObject)dynMethod.CreateDelegate(typeof(CreateObject)); _constrcache.Add(objtype, c); } else // structs { DynamicMethod dynMethod = new DynamicMethod("_", MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, typeof(object), null, objtype, false); ILGenerator ilGen = dynMethod.GetILGenerator(); var lv = ilGen.DeclareLocal(objtype); ilGen.Emit(OpCodes.Ldloca_S, lv); ilGen.Emit(OpCodes.Initobj, objtype); ilGen.Emit(OpCodes.Ldloc_0); ilGen.Emit(OpCodes.Box, objtype); ilGen.Emit(OpCodes.Ret); c = (CreateObject)dynMethod.CreateDelegate(typeof(CreateObject)); _constrcache.Add(objtype, c); } return c(); } } catch (Exception exc) { throw new Exception(string.Format("Failed to fast create instance for type '{0}' from assemebly '{1}'", objtype.FullName, objtype.AssemblyQualifiedName), exc); } }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部