JSON.NET与ProtoBuf在Socket下的应用

1:前言

Socket通信中,客户端与服务器之间传递的是字节流。而在现实的应用中我们需要传递有一定含义的结构。如何传递有意义的结构那?别慌本文就从这里给您做个简单介绍。
首先我们来简单认识一下今天的主角:JSON.NET和ProtoBuf

2:JSON.NET与ProtoBuf

这两个都是开源的项目,项目的地址如下
接下来我们看看两个项目在序列化对象时都是怎么做的。
先看JSON.NET
Code
我们可以看到它对序列化的对象没有什么要求。(“[JsonObject]”可以去掉)
其实JSON的原理也很简单,底层通过反射获取对象的属性然后拼接出形如[{"userName":"dabing","pwd":"110110"},{"userName":"dabing","pwd":"110110"}]的字符串。
下面我们看ProtoBuf
Code
ProtoBuf对要序列化的对象要求首先要有特性来规定像[DataContract],[ProtoMember(1)]其次就是不能有带参的构造函数。

3:JSON.NET与ProtoBuf性能的简单对比

100(J/P) 1000(J/P) 10000(J/P) 100000(J/P)
写 53/100 64/104 162/114 1139/239
读     29/13           64/16              382/42          3561/322
以上表格中100(J/P)表示100个对象在JSON/ProtoBuf下耗费的MS。
以上数据为三次得到的平均值。

从以上数据我们可以简单得出结论(仅供参考)
传递的对象越多两者耗费的时间越长。
传递单个对象的时候JSON表现出更好的性能。传递多个对象的时候ProtoBuf性能更快更稳定。
到这里我们已经把两种框架下序列化和反序列化对象的方法和性能进行了简单的说明,接下来我们再看看两个框架在Socket下是如何应用的。

4:JSON.NET与ProtoBuf在Socket下的写法

以JSON方式传递对象数组
Code
客户端
Code
还有实体类
Code
以ProtoBuf方式传递对象数组
服务端
Code
客户端
Code
我们从代码中可以看到,ProtoBuf本身具有很多与通信相关的特性。
有了以上写法,我们再来看看两个框架再传递对象时的相率对比

5:JSON.NET与ProtoBuf在Socket下传递对象效率简单对比

我们就来看从发送开始到收完数据接收,两个框架传递不同数量对象所消耗的时间。
100(J/P) 1000(J/P) 10000(J/P)
json/proto 97/264 150/143 2202/366

后记
按照惯例,附上本文涉及的所有源代码


posted @ 2009-08-18 16:43  李占卫  阅读(3164)  评论(8编辑  收藏  举报