• 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

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


  • 相关阅读:
    listen and translation exercise 52
    中译英20
    listen and translation exercise 51
    中译英19
    listen and translation exercise 49
    PyQt(Python+Qt)学习随笔:QTableView的showGrid属性
    PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性
    PyQt(Python+Qt)学习随笔:视图中的dragDropMode属性对dragEnabled和acceptDrops属性的影响
    PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系
    PyQt(Python+Qt)学习随笔:QAbstractItemView的verticalScrollMode和horizontalScrollMode属性
  • 原文地址:https://www.cnblogs.com/tommyli/p/1549102.html
Copyright © 2020-2023  润新知