文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>.Net 序列化比较

.Net 序列化比较

时间:2010-10-19  来源:Not Coder

phpRPC, .Net 二进制,soap,xml,.Net Json,Hessian,Burlap,NewtonJson,SilverlightSerializer.

其中 phpRPC  Hessian,Burlap,SilverlightSerializer都属于二进制序列化

其余为文本传输。

每次测试包含序列化和反序列化。

最后幸存的是:Binary Hessian Burlap NewtonJson SilverlightSerializer.

综合比较 二进制序列化首选 Binary,如果需要支持Silverlight那么SilverlightSerializer也是不错的选择。

如果需要文本传输,那么 NewtonJson 适合你。

 

代码是从JavaEye论坛上拿过来修改的。

 



 


 

附代码:

代码 using System;
using System.Collections;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using System.Runtime.Serialization.Json;
using System.Xml.Serialization;
using org.phprpc.util;
using Newtonsoft.Json;
using hessiancsharp.io;
using burlapcsharp.io;
using Serialization;

namespace Test {
    [Serializable]
    class TestClass2
    {
        public int ID;
        public double @double { get; set; }
        public bool @bool { get; set; }
        public float @float { get; set; }
        public double? @double2 { get; set; }
        public bool? @bool2 { get; set; }
        public float? @float2 { get; set; }
        public String UserName { get; set; }
        public String Password { get; set; }
        public DateTime Birthday { get; set; }
    }
    [Serializable]
    class TestClass {
        public IDictionary dictionary { get; set; }
        public IList list { get; set; }
        //private int[] array = new int[] { 1, 2, 3 };
        //public int[] Array { get { return array; } set { } }
        public int ID;
        public double @double { get; set; }
        public bool @bool { get; set; }
        public float @float { get; set; }
        public double? @double2 { get; set; }
        public bool? @bool2 { get; set; }
        public float? @float2 { get; set; }
        public String UserName { get; set; }
        public String Password { get; set; }
        public DateTime Birthday { get; set; }
        public TestClass2 TestClass2 { get; set; }
    }
    class Program {
        static void RunTest(int time, Object data, String info, String filename) {
            GC.Collect();
            DateTime start, end;
            long size = 0;
            StringBuilder sb = new StringBuilder();
            StringBuilder categories = new StringBuilder();
            StringBuilder dataset1 = new StringBuilder();
            StringBuilder dataset2 = new StringBuilder();
            Stream stream;
            object result = null;
            sb.Append("<chart caption='" + time + "次" + info + "序列化与反序列化的比较' shownames='1' showvalues='1' decimals='0' formatNumberScale='0' baseFont='Tahama' baseFontSize='12'>");
            categories.Append("<categories>");
            dataset1.Append("<dataset seriesName='时间'>");
            dataset2.Append("<dataset seriesName='空间'>");
            System.Console.WriteLine("--------------------------------------------------------------------------------");
            System.Console.WriteLine(time + "次" + info);

            try
            {
                start = DateTime.Now;
                PHPFormatter formator1 = new PHPFormatter();
                for (int i = 0; i < time; i++)
                {
                    stream = new MemoryStream();
                    formator1.Serialize(stream, data);
                    size = stream.Length;
                    stream.Position = 0;
                    result = formator1.Deserialize(stream);
                    stream.Close();
                }
                end = DateTime.Now;
                categories.Append("<category label='PHP' />");
                dataset1.Append("<set value='" + ((end.Ticks - start.Ticks) / 10000) + "'/>");
                dataset2.Append("<set value='" + size + "'/>");
                System.Console.WriteLine("PHP - " + "\t\t时间:" + (end.Ticks - start.Ticks) + "\t 长度:" + size);
            }
            catch
            {
                System.Console.WriteLine("PHP不支持!");
            }

            GC.Collect();

            try
            {
                start = DateTime.Now;
                BinaryFormatter formator2 = new BinaryFormatter();
                for (int i = 0; i < time; i++)
                {
                    stream = new MemoryStream();
                    formator2.Serialize(stream, data);
                    size = stream.Length;
                    stream.Position = 0;
                    result = formator2.Deserialize(stream);
                    stream.Close();
                }
                end = DateTime.Now;
                categories.Append("<category label='Binary' />");
                dataset1.Append("<set value='" + ((end.Ticks - start.Ticks) / 10000) + "'/>");
                dataset2.Append("<set value='" + size + "'/>");
                System.Console.WriteLine("Binary - " + "\t时间:" + (end.Ticks - start.Ticks) + "\t 长度:" + size);
            }
            catch
            {
                System.Console.WriteLine("Binary不支持!");
            }
            
            GC.Collect();
            
            try
            {
                start = DateTime.Now;
                SoapFormatter formator3 = new SoapFormatter();
                for (int i = 0; i < time; i++) {
                    stream = new MemoryStream();
                    formator3.Serialize(stream, data);
                    size = stream.Length;
                    stream.Position = 0;
                    result = formator3.Deserialize(stream);
                    stream.Close();
                }
                end = DateTime.Now;
                categories.Append("<category label='SOAP' />");
                dataset1.Append("<set value='" + ((end.Ticks - start.Ticks) / 10000) + "'/>");
                dataset2.Append("<set value='" + size + "'/>");
                System.Console.WriteLine("SOAP - " + "\t\t时间:" + (end.Ticks - start.Ticks) + "\t 长度:" + size);
            }
            catch {
                System.Console.WriteLine("SOAP不支持!");
            }
        
            GC.Collect();

            try {
                start = DateTime.Now;
                XmlSerializer formator4 = new XmlSerializer(data.GetType());
                for (int i = 0; i < time; i++) {
                    stream = new MemoryStream();
                    formator4.Serialize(stream, data);
                    size = stream.Length;
                    stream.Position = 0;
                    result = formator4.Deserialize(stream);
                    stream.Close();
                }
                end = DateTime.Now;
                categories.Append("<category label='XML' />");
                dataset1.Append("<set value='" + ((end.Ticks - start.Ticks) / 10000) + "'/>");
                dataset2.Append("<set value='" + size + "'/>");
                System.Console.WriteLine("XML - " + "\t\t时间:" + (end.Ticks - start.Ticks) + "\t 长度:" + size);
            }
            catch {
                System.Console.WriteLine("XML不支持!");
            }

            GC.Collect();

            try {
                start = DateTime.Now;
                DataContractJsonSerializer formator5 = new DataContractJsonSerializer(data.GetType());
                for (int i = 0; i < time; i++) {
                    stream = new MemoryStream();
                    formator5.WriteObject(stream, data);
                    size = stream.Length;
                    stream.Position = 0;
                    result = formator5.ReadObject(stream);
                    stream.Close();
                }
                end = DateTime.Now;
                categories.Append("<category label='JSON' />");
                dataset1.Append("<set value='" + ((end.Ticks - start.Ticks) / 10000) + "'/>");
                dataset2.Append("<set value='" + size + "'/>");
                System.Console.WriteLine("JSON - " + "\t\t时间:" + (end.Ticks - start.Ticks) + "\t 长度:" + size);
            }
            catch {
                System.Console.WriteLine("JSON不支持!");
            }

            GC.Collect();

            try {
                start = DateTime.Now;
                for (int i = 0; i < time; i++) {
                    stream = new MemoryStream();
                    CHessianOutput formator6o = new CHessianOutput(stream);
                    formator6o.WriteObject(data);
                    size = stream.Length;
                    stream.Position = 0;
                    CHessianInput formator6i = new CHessianInput(stream);
                    result = formator6i.ReadObject();
                    stream.Close();
                }
                end = DateTime.Now;
                categories.Append("<category label='Hessian' />");
                dataset1.Append("<set value='" + ((end.Ticks - start.Ticks) / 10000) + "'/>");
                dataset2.Append("<set value='" + size + "'/>");
                System.Console.WriteLine("Hessian - " + "\t时间:" + (end.Ticks - start.Ticks) + "\t 长度:" + size);
            }
            catch {
                System.Console.WriteLine("Hessian不支持!");
            }

            GC.Collect();

            try {
                start = DateTime.Now;
                for (int i = 0; i < time; i++) {
                    stream = new MemoryStream();
                    CBurlapOutput formator7o = new CBurlapOutput(stream);
                    formator7o.WriteObject(data);
                    size = stream.Length;
                    stream.Position = 0;
                    CBurlapInput formator7i = new CBurlapInput(stream);
                    result = formator7i.ReadObject();
                    stream.Close();
                }
                end = DateTime.Now;
                categories.Append("<category label='Burlap' />");
                dataset1.Append("<set value='" + ((end.Ticks - start.Ticks) / 10000) + "'/>");
                dataset2.Append("<set value='" + size + "'/>");
                System.Console.WriteLine("Burlap - " + "\t时间:" + (end.Ticks - start.Ticks) + "\t 长度:" + size);
            }
            catch {
                System.Console.WriteLine("Burlap不支持!");
            }

            GC.Collect();

            try
            {
                start = DateTime.Now;

                for (int i = 0; i < time; i++)
                {
                    string sstream = JsonConvert.SerializeObject(data);
                    //File.WriteAllText(@"E:\NewtonJS.txt", sstream);
                    size = sstream.Length;
                    result = JsonConvert.DeserializeObject(sstream);
                }
                end = DateTime.Now;
                categories.Append("<category label='NewtonJS' />");
                dataset1.Append("<set value='" + ((end.Ticks - start.Ticks) / 10000) + "'/>");
                dataset2.Append("<set value='" + size + "'/>");
                System.Console.WriteLine("NewtonJS - " + "\t时间:" + (end.Ticks - start.Ticks) + "\t 长度:" + size);
            }
            catch
            {
                System.Console.WriteLine("NewtonJS不支持!");
            }

            try
            {
                start = DateTime.Now;

                for (int i = 0; i < time; i++)
                {
                    byte[] sstream = SilverlightSerializer.Serialize(data);
                    //File.WriteAllBytes(@"E:\SilverSeria.txt", sstream);
                    size = sstream.Length;
                    result = SilverlightSerializer.Deserialize(sstream);
                }
                end = DateTime.Now;
                categories.Append("<category label='SilverSeria' />");
                dataset1.Append("<set value='" + ((end.Ticks - start.Ticks) / 10000) + "'/>");
                dataset2.Append("<set value='" + size + "'/>");
                System.Console.WriteLine("SilverSeria - " + "\t时间:" + (end.Ticks - start.Ticks) + "\t 长度:" + size);
            }
            catch
            {
                System.Console.WriteLine("SilverSeria不支持!");
            }


            categories.Append("</categories>");
            dataset1.Append("</dataset>");
            dataset2.Append("</dataset>");
            sb.Append(categories);
            sb.Append(dataset1);
            sb.Append(dataset2);
            sb.Append("</chart>");
            File.WriteAllText(filename, sb.ToString(), Encoding.Default);
            System.Console.WriteLine(result);
            System.Console.WriteLine("--------------------------------------------------------------------------------");
            GC.Collect();
        }
        static void Main(string[] args) {

            RunTest(10000, 1234567, "对整数1234567", "1.xml");
            RunTest(10000, true, "对布尔值true", "2.xml");
            RunTest(10000, 1e123, "对浮点数1e123", "3.xml");
            RunTest(10000, 1.2, "对浮点数1.2", "4.xml");
            RunTest(10000, 1234567890987654321, "对UInt64型1234567890987654321", "5.xml");
            RunTest(10000, Double.PositiveInfinity, "对无穷大", "6.xml");

            String s = "PHPRPC - perfect high performance remote procedure call";
            RunTest(10000, s, "对字符串“" + s + "”", "7.xml");

            byte[] ba = new byte[10000];
            for (int i = 0; i < 10000; i++)
            {
                ba[i] = (byte)(i % 255);
            }
            RunTest(2000, ba, "对10000个元素的字节数组", "8.xml");

            string[] sa = new string[100];
            for (int i = 0; i < 100; i++)
            {
                sa[i] = s;
            }
            RunTest(2000, sa, "对100个相同元素的字符串数组", "9.xml");

            sa = new string[100];
            for (int i = 0; i < 100; i++)
            {
                sa[i] = s + i;
            }
            RunTest(2000, sa, "对100个不同元素的字符串数组", "10.xml");

            Hashtable h = new Hashtable();
            for (int i = 0; i < 100; i++)
            {
                h[s + i] = s + (i + 100);
            }
            RunTest(2000, h, "对索引不同内容不同具有100个字符串元素和字符串索引的 Hashtable", "11.xml");

            ArrayList list = new ArrayList();
            for (int i = 0; i < 1000; i++) {
                TestClass tc = new TestClass();
                tc.ID = i;
                tc.UserName = "PHPRPC";
                tc.Password = "Hello";
                tc.Birthday = DateTime.Now;
                tc.@float = 0;
                tc.float2 = 0;
                TestClass2 tc2 = new TestClass2();
                tc2.ID = i;
                tc2.UserName = "PHPRPC";
                tc2.Password = "Hello";
                tc2.Birthday = DateTime.Now;
                tc2.@float = 0;
                tc2.float2 = 0;
                tc.TestClass2 = tc2;
                try
                {
                    //tc.dictionary = new Hashtable();
                    tc.dictionary = new Dictionary<string, string>();
                    tc.dictionary.Add(DateTime.Now.ToString(), DateTime.Now.ToString());
                    tc.dictionary.Add(DateTime.Now.ToString(), DateTime.Now.ToString());
                    tc.dictionary.Add(DateTime.Now.ToString(), DateTime.Now.ToString());
                    tc.dictionary.Add(1, 1);
                    tc.dictionary.Add(2, 2);
                    tc.dictionary.Add(3, 3);
                }
                catch { }
                try
                {
                    tc.list = new List<int>();
                    tc.list.Add(1);
                    tc.list.Add(1);
                    tc.list.Add(1);
                    tc.list.Add(1);
                    tc.list.Add(1);
                    tc.list.Add(2);
                    tc.list.Add(2);
                    tc.list.Add(2);
                    tc.list.Add(3);
                }
                catch { }
                list.Add(tc);
            }
            RunTest(1, list, "对具有1000个自定义类型元素的 ArrayList", "12.xml");

            System.Console.WriteLine("--------------------------------------------------------------------------------");
            System.Console.WriteLine("----------------------------------END-------------------------------------------");
           
            GC.Collect();

            Console.ReadLine();
        }
    }
}


 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载