[开源] KJFramework.Message 智能二进制消息框架
框架的介绍:1. 已经完成了对于消息内部类型的支持(int, short, long, uint, ushort, ulong, bool ,float, double, byte, byte[], 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. 从下列代码中可以看到,此类型拥有很多的数组,而且还包含了其他的子类型
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; }
}
}
序列化复杂对象:
.次数 100000: 3720(ms) *此值根据测试机器的配置不同而不同,仅供参考
.Gen0回收次数: 79
.Gen1回收次数: 59
.Gen2回收次数: 2
反序列化复杂对象:
.次数 100000: 2920(ms) *此值根据测试机器的配置不同而不同,仅供参考
.Gen0回收次数: 132
.Gen1回收次数: 1
.Gen2回收次数: 1
数据段格式图:
更高的自定义需求:
在此框架中,对于每一个可以序列化的类型(int, string .....等等),都会为其配备一个智能类型处理器(IIntellectTypeProcessor),在框架的使用中,这些处理器都是默认的,如果,您感觉还有更好的实现能够加速
当前的序列化或者反序列化流程,那么,您可以在您的系统初始化的时候,使用自己的智能类型处理器来替换系统
现有的。 这样,就达到了可自定义类型序列化和反序列化的标准和算法 :) 当然,您也可以选择添加一个新的处理器。
其次,在KJFramework.Message中,我们能看到,每一个可序列化的字段,都需要一个智能属性标记[IntellectPropery]
而每个这种标记都需要为序列化的字段提供一个唯一的数字序号,就比如:[IntellectProperty(0)] ,如果当您的自定义类型,需要为一个特殊的字段做特殊处理的时候,可以选择为一个特殊的编号字段来定制一个特殊的智能类型处理器。
比如,我们的登录消息,如果有一个字段用来存储密码,而我们恰巧需要为此字段进行MD5加密。
那么,该怎么办呢? 当然,办法有很多种,我们可以选择先进行MD5的加密,然后再赋值,也可以选择如下的方式:
/*以下为代码示例*/
public class LogonMessage : IntellectObject
{
[IntellectProperty(0)]
public string UserName{get;set;}
//可以看到,Password字段的序号为1.
//我们就可以单独添加一个字段处理器 来处理每一个消息实体内包含有序号1的字段
[IntellectProperty(1)]
public string Password{get;set;}
}
*请不用担心,KJFramework.Message内部会对此操作做特殊的支持,好来完成您的特殊需求 :)
附:
此框架目前已经能够达到初步的商用层次,完全可以当做网络消息协议的序列化和反序列化转换层来使用,
相信使用过GOOGLE的ProtoBuffer的朋友都应该明白了。我会一直更新此框架,如果您的项目中有此类需求,
那么您可以选择尝试一下这套框架, 不会让您失望的 :)
项目地址:http://message.codeplex.com/
目前此项目已经发布了Release版本,您可以选择直接下载二进制文件使用,或者下载源代码 :)
如果在使用此框架的途中,有任何问题,您也可以选择与我联系,我将提供最优的技术支持。
QQ:250623008
Email: Kevin.Jee@live.cn
谢谢. --------------------编程问答-------------------- 看上次性能上还不错,但问题在于这个新组件没有基于通用的协议(如XML) --------------------编程问答--------------------
谢谢, 此组件就不是为了现有的通用协议而设计的,是一个新的协议 :)
以后,我会找人负责编写 JAVA版本的KJFramework.Message这样就可以跨平台使用了。
补充:.NET技术 , C#