zoukankan      html  css  js  c++  java
  • fastjson

    JSON数据格式简洁,用于数据的持久化和对象传输很实用。最近在做一个Razor代码生成器,需要把数据库的表和列的信息修改后保存下来,想到用JSON序列化对象并保存,需要时再反序列化成对象会简单一些。codeplex上发现了fastJSON项目,好像很不错的样子。这里是作者做的性能测试:

     

    项目和详细的性能测试地址:http://www.codeproject.com/Articles/159450/fastJSON

    代码调用

    复制代码
    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的。

    快速的秘密

    大体浏览了一下代码,发现之所以快速的原因是作者利用反射时Emit了大量的IL代码:

    复制代码
    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);
                }
            }
    复制代码

    ////////////////////////////////一些基本的

    XMLHttpRequest一些常用属性:

    当一个XMLHttpRequest对象被创立后,readyState属性标示了当前对象处于什么状态,可以通过对该属性的访问,来判读此次请求的状态然后做出相应的操作

    1.responseText属性
    responseText属性包含客服端接收到的HTTP响应的文本内容,当readyState属性为0、1或2时,responseText属性包含一个空字符串:当readyState属性值为3时,响应中包含客服端还没完成的响应信息;当readyState属性值卫4,responseText属性才包含完整的响应信息。
    2.responseXML属性
    只有当readyState属性为4,并且响应头部的Content-Type的MIME类型被指定为XML(text/xml或者application/xml)时,该属性才会有值并且被解析成一个XML文档,否则该属性为null。如果是回传的XML文档结构不良或者未完成响应回传,该属性也会为null。responseXML属性用来描述被XMLHttpRequest解析后的XML文档的属性。
    3.status属性
    status属性描述了HTTP状态代码,注意,仅当readyState属性值为3(正在接受中)或者4(已加载)时,才能对此属性进行访问。如果在readyState属性值小于3时,试图去读取status属性值,将引发一个异常。
    4.statusText属性
    statusText属性描述了HTTP状态代码文本,并且仅当readyState属性为3或者4才可用。当readyState属性为其他值时试图存取statusText属性将引发一个异常。

  • 相关阅读:
    DEV GridView显示行号
    winfrom Log4Net 代码(二) 记录格式log_info.txt和log_error.txt,只产生两个文本,里面分别记录提示信息和报错信息
    VB.NET使用Log4Net
    Log4Net使用中loginfo.IsInfoEnabled=false问题解决方法
    VB.NET 根据当前日期获取星期几
    VB.NET 发送outLook邮件body基于Html样式
    VB.NET NPOI快速导入导出Excel
    python使用cx_oracle连接oracle数据库
    物理STANDBY库创建还原点(打开为READ WRITE后再变回STANDBY库)
    oracle RAC和RACOneNode之间的转换
  • 原文地址:https://www.cnblogs.com/xlht/p/6580262.html
Copyright © 2011-2022 走看看