C# 各种序列化性能比较
来源:互联网 发布:大数据txt下载 编辑:程序博客网 时间:2024/04/28 22:40
今天简单做了一个各种序列化的用时比较,最终结果如下:
xml:262
JSON:36
自己写的序列化:17
XML(XmlSerializerr,无需标记[Serializable])=18
二进制(BinaryFormatter)=45
具体代码如下:
protected void Button2_Click(object sender, EventArgs e)
{
List<TestData> tdlist = new List<TestData>();
for (int i = 0; i < 10000; i++)
{
tdlist.Add(new TestData() { Name = Guid.NewGuid().ToString(), Address = "Address" + i.ToString() });
}
string msg = "";
#region 序列化为XML
Stopwatch watch = new Stopwatch();
watch.Start();
string xmlresult = XmlSerialize(tdlist);
watch.Stop();
msg += "xml:" + watch.ElapsedMilliseconds.ToString() + "<br/>";
#endregion
#region 序列化为JSON
watch.Restart();
string json = JsonSerialize(tdlist);
watch.Stop();
msg += "JSON:" + watch.ElapsedMilliseconds.ToString() + "<br/>";
#endregion
#region 自己拼写为JSON
watch.Restart();
StringBuilder sbjson = new StringBuilder("[");
int j = 0;
foreach (TestData item in tdlist)
{
string str = "";
if (j < tdlist.Count - 1)
{
str = "{\"Name\":\"" + item.Name + "\",\"Address\":\"" + item.Address + "\"},";
sbjson.Append(str);
}
else
{
str = "{\"Name\":\"" + item.Name + "\",\"Address\":\"" + item.Address + "\"}";
sbjson.Append(str);
}
}
sbjson.Append("]");
string strsbjson = sbjson.ToString();
watch.Stop();
msg += "自己写的序列化:" + watch.ElapsedMilliseconds.ToString() + "<br/>";
#endregion
#region 另外一种XML
watch.Restart();
XmlSerializer xs = new XmlSerializer(tdlist.GetType());
using (MemoryStream stream = new MemoryStream())
{
xs.Serialize(stream, tdlist);
stream.Close();
}
watch.Stop();
msg += string.Format("XML(XmlSerializerr,无需标记[Serializable])={0}<br/>", watch.ElapsedMilliseconds);
#endregion
#region 序列化为二进制
watch.Restart();
try
{
byte[] by;
using (MemoryStream fileStream = new MemoryStream())
{
BinaryFormatter b = new BinaryFormatter();
b.Serialize(fileStream, tdlist);
by = fileStream.ToArray();
fileStream.Close();
}
msg += string.Format("二进制(BinaryFormatter)={0}<br/>", watch.ElapsedMilliseconds);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
watch.Stop();
#endregion
#region 使用SOAP
watch.Restart();
//使用SOAP序列化
try
{
//序列化,Soap不能序列化泛型对象,所以只能指定序列化一个Programmer对象
//using (FileStream fs = new FileStream(strFile, FileMode.Create))
using (MemoryStream fs = new MemoryStream())
{
SoapFormatter formatter = new SoapFormatter();
formatter.Serialize(fs, tdlist);
}
msg += string.Format("SOAP(SoapFormatter)={0}<br/>", watch.ElapsedMilliseconds);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
watch.Stop();
#endregion
lblSerier.Text = msg;
}
private static string XmlSerialize(object o)
{
XmlSerializer ser = new XmlSerializer(o.GetType());
System.IO.MemoryStream mem = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(mem, Encoding.UTF8);
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
ser.Serialize(writer, o, ns);
writer.Close();
return Encoding.UTF8.GetString(mem.ToArray());
}
private static T XmlDeserialize<T>(string s)
{
XmlDocument xdoc = new XmlDocument();
try
{
xdoc.LoadXml(s);
XmlNodeReader reader = new XmlNodeReader(xdoc.DocumentElement);
XmlSerializer ser = new XmlSerializer(typeof(T));
object obj = ser.Deserialize(reader);
return (T)obj;
}
catch
{
return default(T);
}
}
private static string JsonSerialize(object o)
{
using (var ms = new MemoryStream())
{
new DataContractJsonSerializer(o.GetType()).WriteObject(ms, o);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
private static T JsonDeserialize<T>(string s)
{
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(s)))
{
return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);
}
}
/// <summary>
/// 将对象根据格式(XML/JSON)序列化成字符串结果
/// </summary>
/// <param name="o">目标对象</param>
/// <param name="format">输出格式</param>
/// <returns></returns>
public static string Serialize(object o, Format format)
{
if (format == Format.Xml)
{
return XmlSerialize(o);
}
else
{
return JsonSerialize(o);
}
}
/// <summary>
/// 将字符串根据格式(XML/JSON)反序列化成指定类型的对象
/// </summary>
/// <typeparam name="T">指定类型</typeparam>
/// <param name="s">目标字符串</param>
/// <param name="format">输入格式</param>
/// <returns></returns>
public static T Deserialize<T>(string s, Format format)
{
if (format == Format.Xml)
{
return XmlDeserialize<T>(s);
}
else
{
return JsonDeserialize<T>(s);
}
}
public enum Format
{
Xml
}
[Serializable]
public class TestData
{
internal string _Name = string.Empty;
public string Name
{
get
{
return this._Name;
}
set
{
{
_Name = value;
}
}
}
internal string _Address = string.Empty;
public string Address
{
get
{
return this._Address;
}
set
{
{
_Address = value;
}
}
}
}
- C# 各种序列化性能比较
- 各种Java序列化性能比较
- Java序列化性能比较
- Java ---序列化性能比较
- Kryo序列化和ProroStruff序列化性能比较
- java原生序列化和Kryo序列化性能比较
- java序列化和反序列化性能比较
- java原生序列化和Kryo(dubbo)序列化性能比较
- java原生序列化和Kryo序列化性能比较 以及Kryo使用方法
- json-lib和jackson进行Java对象到json字符串序列化性能比较
- ServiceStack.Text / Newtonsoft.Json 两种json序列化性能比较
- 用 JMH 检测 Lambdas 序列化性能
- php serialize json_encode 序列化性能测试
- 序列化反序列化性能对比
- 解开 phprpc 序列化性能高于 hessian 的秘密
- protobuf,thrift,avro之序列化性能测试
- PHP5.5四种序列化性能对比
- PHP5.5四种序列化性能对比
- asp.net调试总结
- 闲聊linux中的input设备
- VS中的路径宏 vc++中OutDir、ProjectDir、SolutionDir各种路径
- linux内核input子系统解析
- 在myeclipse中安装struts2插件
- C# 各种序列化性能比较
- CentOS下忘记mysql密码的解决办法
- Raphaël —— JavaScript 库
- input子系统详解
- 销售
- Learning ADSP-TS201系列--重要参考
- 计算指定文件夹下文件总数
- 短时间让大家对C++ STL有所学习
- Qt窗口操作函数(最大化,全屏,隐藏最大化,最小化)