Not Coder

coding 是一种思维方式

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

序列化:

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 { getset; }
        
public bool @bool { getset; }
        
public float @float { getset; }
        
public double? @double2 { getset; }
        
public bool? @bool2 { getset; }
        
public float? @float2 { getset; }
        
public String UserName { getset; }
        
public String Password { getset; }
        
public DateTime Birthday { getset; }
    }
    [Serializable]
    
class TestClass {
        
public IDictionary dictionary { getset; }
        
public IList list { getset; }
        
//private int[] array = new int[] { 1, 2, 3 };
        
//public int[] Array { get { return array; } set { } }
        public int ID;
        
public double @double { getset; }
        
public bool @bool { getset; }
        
public float @float { getset; }
        
public double? @double2 { getset; }
        
public bool? @bool2 { getset; }
        
public float? @float2 { getset; }
        
public String UserName { getset; }
        
public String Password { getset; }
        
public DateTime Birthday { getset; }
        
public TestClass2 TestClass2 { getset; }
    }
    
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(
100001234567"对整数1234567""1.xml");
            RunTest(
10000true"对布尔值true""2.xml");
            RunTest(
10000, 1e123, "对浮点数1e123""3.xml");
            RunTest(
100001.2"对浮点数1.2""4.xml");
            RunTest(
100001234567890987654321"对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<stringstring>();
                    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(
11);
                    tc.dictionary.Add(
22);
                    tc.dictionary.Add(
33);
                }
                
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();
        }
    }
}


 

posted on 2010-10-19 18:07  Not Coder  阅读(1331)  评论(0编辑  收藏  举报