[开源] KJFramework.Message 智能二进制消息框架 - 新的性能提升!
框架的介绍:
1. 已经完成了对于消息内部类型的支持(int, short, long, uint, ushort, ulong, bool ,float, double, byte, sbyte, byte[], decimal, DateTime, IntPtr, Guid)
2. 支持内部序列化元数据(.NET可序列化的对象)
3. 对于智能对象内部的“智能对象”提供支持。 支持迭代元数据转换。
[说明:]
KJFramework框架中内置了一套,可以将网络传输实体自动转换为二进制元数据的能力框架。
使用此框架,将使得用户不在关心底层传输时对于二进制编码/解码的繁琐过程,解放程序员的脑力劳动。
目前此内置框架被初步定义在命名空间:KJFramework.Messages内,拥有独立Assembly.
对于智能二进制消息框架, 内部提供了对于诸多类型的支持,甚至可以用于在不编写序列化代码的情况下,
将一个网络传输实体转换为二进制操作。
这一切的操作,都全部由内部框架完成,通过简单的属性标签,就可以实现很强大的转换功能。
目前智能二进制消息框架中,仍保留了内部扩展能力,日后扩展后,将会通过配置文件来增强配置能力。
与此框架类似的通用组件:
ProtoBuffer - Google.
此框架的应用:
可以将此框架应用到网络对象的传输上,也就是说,当我们做一个分布式系统的时候,
只需要使用此框架,我们将无需再关心底层消息对象的序列化和反序列化细节,这一切的
工作将会由框架内部来完成。
性能指标:
此框架的基于.NETFRAMEWORK 4.0开发
测试平台:
CPU: Intel(R)Xeon(R)CPU X5670 @2.93GHz @2.93GHz (2处理器)
System: Windows Server 2008 R2 Enterprise
定义: 复杂对象,内部包含了多个数组类型的成员,比如string[], int[],
内部还嵌套了其余类。
*想看看在这里测试的复杂对象到底有多复杂吗? 附上测试类的代码
*在我们的测试中,使用的是下列代码中的TestObject. 从下列代码中可以看到,此类型拥有很多的数组,而且还包含了其他的子类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | public class TestObject : IntellectObject { private TestObject1 _obj; [IntellectProperty(7)] public TestObject1 Obj { get { return _obj; } set { _obj = value; } } private int [] _mm; [IntellectProperty(0)] public int [] Mm { get { return _mm; } set { _mm = value; } } private TestObject1[] _pp; [IntellectProperty(27)] public TestObject1[] Pp { get { return _pp; } set { _pp = value; } } private String[] _uu; [IntellectProperty(28)] public String[] Uu { get { return _uu; } set { _uu = value; } } private TestObject2[] _nn; [IntellectProperty(30)] public TestObject2[] Nn { get { return _nn; } set { _nn = value; } } private String[] _jj; [IntellectProperty(26)] public String[] Jj { get { return _jj; } set { _jj = value; } } private int _wokao; [IntellectProperty(4)] public int Wokao { get { return _wokao; } set { _wokao = value; } } private int _wocao; [IntellectProperty(2)] public int Wocao { get { return _wocao; } set { _wocao = value; } } private string _woqunimade; [IntellectProperty(3)] public string Woqunimade { get { return _woqunimade; } set { _woqunimade = value; } } private byte [] _metadata; [IntellectProperty(13)] public byte [] Metadata { get { return _metadata; } set { _metadata = value; } } private byte _metadata1; [IntellectProperty(15)] public byte Metadata1 { get { return _metadata1; } set { _metadata1 = value; } } private TestObject2 _obj2; [IntellectProperty(16)] public TestObject2 Obj2 { get { return _obj2; } set { _obj2 = value; } } private DateTime _time; [IntellectProperty(100)] public DateTime Time { get { return _time; } set { _time = value; } } } public class TestObject1 : IntellectObject { private string _haha; [IntellectProperty(0)] public string Haha { get { return _haha; } set { _haha = value; } } private Colors _colors; [IntellectProperty(1)] public Colors Colors { get { return _colors; } set { _colors = value; } } } [Serializable] public class TestObject2 : IClassSerializeObject { private int _nice; public int Nice { get { return _nice; } set { _nice = value; } } } |
*请注意: 由于性能的提升, 我们在11月18日更新了性能指标!
序列化复杂对象(DEBUG):
.次数 100000: 1858(ms) *此值根据测试机器的配置不同而不同,仅供参考
.Gen0回收次数: 39
.Gen1回收次数: 38
.Gen2回收次数: 1
反序列化复杂对象(DEBUG):
.次数 100000: 1244(ms) *此值根据测试机器的配置不同而不同,仅供参考
.Gen0回收次数: 22
.Gen1回收次数: 1
.Gen2回收次数: 0
序列化复杂对象(RELEASE):
.次数 100000: 1508(ms) *此值根据测试机器的配置不同而不同,仅供参考
.Gen0回收次数: 39
.Gen1回收次数: 38
.Gen2回收次数: 1
反序列化复杂对象(RELEASE):
.次数 100000: 942(ms) *此值根据测试机器的配置不同而不同,仅供参考
.Gen0回收次数: 22
.Gen1回收次数: 1
.Gen2回收次数: 0
*具体的测试截图, 请查看源代码Pictures目录下的图片.
数据段格式图:
更高的自定义需求:
在此框架中,对于每一个可以序列化的类型(int, string .....等等),都会为其配备一个智能类型处理器(IIntellectTypeProcessor),在框架的使用中,这些处理器都是默认的,如果,您感觉还有更好的实现能够加速
当前的序列化或者反序列化流程,那么,您可以在您的系统初始化的时候,使用自己的智能类型处理器来替换系统
现有的。 这样,就达到了可自定义类型序列化和反序列化的标准和算法 :) 当然,您也可以选择添加一个新的处理器。
其次,在KJFramework.Message中,我们能看到,每一个可序列化的字段,都需要一个智能属性标记[IntellectPropery]
而每个这种标记都需要为序列化的字段提供一个唯一的数字序号,就比如:[IntellectProperty(0)] ,如果当您的自定义类型,需要为一个特殊的字段做特殊处理的时候,可以选择为一个特殊的编号字段来定制一个特殊的智能类型处理器。
比如,我们的登录消息,如果有一个字段用来存储密码,而我们恰巧需要为此字段进行MD5加密。
那么,该怎么办呢? 当然,办法有很多种,我们可以选择先进行MD5的加密,然后再赋值,也可以选择如下的方式:
1 2 3 4 5 6 7 8 9 10 11 | /*以下为代码示例*/ public class LogonMessage : IntellectObject { [IntellectProperty(0)] public string UserName{ get ; set ;} //可以看到,Password字段的序号为1. //我们就可以单独添加一个字段处理器 来处理每一个消息实体内包含有序号1的字段 [IntellectProperty(1)] public string Password{ get ; set ;} } |
*请不用担心,KJFramework.Message内部会对此操作做特殊的支持,好来完成您的特殊需求 :)
更专业的需求:
现在我们已经为一个智能对象(IntellectObject)加入了描述自身的能力(New)。 也就是说,使用者随时随地
都可以通过如下调用 来得到当前对象的字符串形式描述信息。
IntellectObject.ToString();
当得到了一个对象的描述信息后,我们就能够很轻松的将其记录到日志文件中,这是不是很方便呢?
在日后,我们将会不停地更新这套框架,这也就意味着,会有越来越多的功能在以后会被加入,
如果您感兴趣,我们希望您能够持续关注。
附:
此框架目前已经能够达到初步的商用层次,完全可以当做网络消息协议的序列化和反序列化转换层来使用,
相信使用过GOOGLE的ProtoBuffer的朋友都应该明白了。我会一直更新此框架,如果您的项目中有此类需求,
那么您可以选择尝试一下这套框架, 不会让您失望的 :)
项目地址:http://message.codeplex.com/
目前此项目已经发布了Release版本,您可以选择直接下载二进制文件使用,或者下载源代码 :)
如果在使用此框架的途中,有任何问题,您也可以选择与我联系,我将提供最优的技术支持。
QQ:250623008
Email: Kevin.Jee@live.cn
谢谢.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述