介绍
HTLSharp是一个C#端口和HPC模板库(HTL)的升级。在HTL
与HTLSharp
库线程安全的容器,随机数生成器和分布,以及集成的序列化引擎提供的软件包。有关原始的更多信息HTL
,
HTLSharp
库中的软件包如下所示:
包装说明 | 运行状态 |
HtlArchive :包含对象的序列化和反序列化所需的所有类。它包含一个通用的归档树/节点系统和不同的序列化程序包(XML,XDL,JSON等),它们保存了数据结构。 |
归档模型(100%)XML(100%)XDL(100%)JSON(50%) |
HtlBase :包含使用HTL系统使对象可序列化的基类。 |
(100%) |
HtlContainer :包含所有HTL的容器类(HtlVector ,HtlMap ,HtlQueue 等等)。这个集合中的所有容器都可以在HTL系统中进行序列化。 - (全面运作) |
(100%) |
HtlGlobal :包含全局使用的枚举类型,struct s等 |
(100%) |
HtlGUID :包含三个全局唯一标识符(GUID); 64位,128位和256位 |
(100%) |
HtlRandNumGen :包含随机数生成器和随机分布生成器的系统。 |
(100%) |
HtlString :包含提供STL样式sprintf() 和sscanf() 方法的类。 |
(100%) |
HtlTest :包含HTL 单元测试系统。这是一个基于测试名称的单元测试系统,类似于boost,但是没有使用宏。 |
(100%) |
HtlThread :包含所有线程相关的类,包括互斥锁,信号量,线程等 |
(100%) |
应该指出的是,一些包如信号和插槽没有从原始库移植到C#。这是因为事件处理基础结构已经存在于基本的C#库中。另外,尽管C#.NET中有一些多线程的容器,但是它们并没有与HTL序列化引擎集成,所以决定封装原始的通用容器。应该注意的是,在提供的源代码项目中,有一个单元测试项目来说明代码的用法。
HtlArchive包
以下部分将说明代码使用情况。该HTL
归档包是一个非常强大的序列化系统。系统使用通用对象树结构来表示内存中的任何数据结构。该数据结构独立于所使用的序列化方法。因此,相同的序列化结构可以提供XML序列化或JSON序列化。这允许开发人员编写类的代码,而不用担心序列化的方法。让我们开始吧。
HTLSharp
可以序列的任何集成的数据类型(bool
,int
,long
,float
,double
,string
,等),以及作为从继承的任何类HtlBase
。HtlBase
是一个轻量级的对象,只有两个成员变量(m_strType
和m_objType
)以及两个用于序列化(Save
和Load
)的虚拟函数; 的m_strType
是在所使用的static object
工厂,用于创建任何类型的继承自对象的HtlBase
并已被登记。让我们看看Save
和Load
方法。这是他们的原型:
public virtual int Save(ref HtlElement ptrCurrNode, ref string strMemVarName, bool blnWithSubObjects) public virtual int Load(ref HtlElement ptrCurrNode, ref string strMemVarName)
的HtlElement
传入是被保存或加载的通用数据结构的当前节点。这strMemVarName
是该string
节点的名称。Save
还有一个布尔标志传递是否sub
要写入对象。这在您只想在该级别进行浅层打印而不是sub
下面所有对象的情况下非常有用。现在让我们来看看他们实施。这TestObj2
是单元测试项目中的一个类。这里是save
和load
方法object
。
//Virtual Inheritance Serialization Engines //SERIALIZATION FUNCTIONS/////////////////////////////////////// //!Save member data to the current element node public override int Save (ref HtlElement ptrCurrNode, ref string strMemVarName, bool blnWithSubObjects) { int intReturn = 0; //SAFETY CHECK //put at top of all Serialize Methods if (ptrCurrNode == null) { return 0; }; //CALL PARENT CLASS Serialize() base.Save(ref ptrCurrNode, ref strMemVarName, blnWithSubObjects); //strSTDBaseType.clear(); //strBaseType.clear(); //Standard Member Variables intReturn &= HtlMemVar.SetMemVar(ref ptrCurrNode, "m_myBool", ref m_myBool, false); intReturn &= HtlMemVar.SetMemVar (ref ptrCurrNode, "m_myInt01", ref m_myInt01, false); intReturn &= HtlMemVar.SetMemVar (ref ptrCurrNode, "m_myDouble04", ref m_myDouble04, false); intReturn &= HtlMemVar.SetMemVar (ref ptrCurrNode, "m_myString", ref m_myString, false); //Sub Object Member Variables if (blnWithSubObjects) { intReturn &= HtlMemVar.SetMemVar (ref ptrCurrNode, "m_myTestObj", ref m_myTestObj, blnWithSubObjects); }; return intReturn; } //!Load member data from the current element node public override int Load(ref HtlElement ptrCurrNode, ref string strMemVarName) { int intReturn = 0; //SAFETY CHECK //put at top of all Serialize Methods if (ptrCurrNode == null) { return 0; }; //CALL PARENT CLASS Serialize() base.Load(ref ptrCurrNode, ref strMemVarName); //Standard Member Variables string strRet = System.String.Empty; intReturn &= HtlMemVar.GetMemVar (ref ptrCurrNode, "m_myBool", ref m_myBool); intReturn &= HtlMemVar.GetMemVar (ref ptrCurrNode, "m_myInt01", ref m_myInt01); intReturn &= HtlMemVar.GetMemVar (ref ptrCurrNode, "m_myDouble04", ref m_myDouble04); intReturn &= HtlMemVar.GetMemVar (ref ptrCurrNode, "m_myString", ref m_myString); intReturn &= HtlMemVar.GetMemVar (ref ptrCurrNode, "m_myTestObj", ref m_myTestObj); return intReturn; }
该Save
方法的第一件事是调用父类的Save
方法。然后,继续设置该类的所有成员变量。在这种情况下,有一个bool
,一个int
,一double
,一个string
类型,并且一个子对象TestObj01
,其也从继承HtlBase
。注意在s TestObj01
的布尔检查中print sub object
。成员变量的设置是通过调用HtlMemVar.SetMemVar
方法来实现的。您传入对当前节点的引用,该string
成员变量的名称以及对该对象的引用。注意所有的基础对象成员变量都被blnWithSubObjects
设置为false
。
同样,该Load
方法调用父类Load
,然后继续调用交互GetMemVar
函数。应该指出的是,同时拥有Save
一个Load
方法和一个方法的原因是有时开发人员希望只写成员变量(比如GUID
s)。该系统也适用于HTL中的所有容器。这是一个HtlVector
序列化的例子。
intReturn &= HtlMemVar.SetMemVar> (ref ptrCurrNode, "m_arrObjs", ref m_arrObjs, true);
一旦save
被调用,用户就可以序列化所需的串行器。以下示例使用XDL序列化程序。
TestObj02 obj = new TestObj02(); string strOut = System.String.Empty; string strTopName = "rootobject"; HtlXDLWriter writer = new HtlXDLWriter(); HtlElement root = new HtlElement(); //serialize obj.Save(ref root, ref strTopName, true); root.UpdateIndexes(); writer.SaveXDLTree(ref root, ref strOut, true); // Write the string to a file. System.IO.StreamWriter outfile = new System.IO.StreamWriter("HtlTestArch_XDL_Obj02Nested.out"); outfile.Write(strOut); outfile.Close(); //clear the values obj.m_myBool = false; obj.m_myInt01 = -1; obj.m_myDouble04 = -1.0f; obj.m_myString = "null"; obj.m_myTestObj.Reset(); //now read it back in and deserialize HtlElementIndex xelem = new HtlElementIndex(); HtlXDLReader reader = new HtlXDLReader(); HtlElement readroot = new HtlElement(); reader.LoadXDLTree(ref readroot, ref strOut, ref xelem); obj.Load(ref readroot, ref strTopName);
HtlContainer包
我们决定为C#.NET库中的Vector
(List
),Map
(Dictionary
)和Queue
类提供包装。有了这三个基本的容器,你可以覆盖你的大部分需求。但是,如果需要另一个线程安全的包装,它们将为用户提供一个很好的路线图,以便如何创建一个。如前所述,容器(除了多线程支持)的主要意图是将其与归档系统集成。所HtlTestSuite
提供的单元测试提供了XML和XDL输出示例。JSON正在开发中,应该尽快添加。请参阅多线程测试和验证的单元测试。
HtlRandNumGen包
有两个随机数发生器(LCG和梅森倍捻机)和五个分布(HtlUniform
,HtlGamma
,HtlGaussian
,HtlPoisson
,HtlExponential
)。提供均匀,指数和高斯的单元测试。RNG使用简单。只需创建对象,打电话initialize()
给你的种子,然后打电话next()
来获得下一个RNG。HtlUniform
也可以使用intGetNextAB()
或sngGetNextAB()
功能在一定范围内生成RNG 。
HtlGUID包
有64位,128位和256位全局唯一标识符可用。他们从继承,HtlBase
所以他们是直接序列化。有一点需要注意的是,他们是不同的windows GUID
类对称。所有的部分是相等的宽度。这里是一个例子HtlGUID128
:
975D3F24-F81FF9EB-2F556151-5F9D2204
这使得他们更简单的工作,其呈现更整洁。
HtlTest包
该HtlNode
软件包具有类似于HtlElement
归档软件包中的类的基于节点的体系结构。HtlTestNode
可以包含其他测试节点,根节点会触发所有的子节点。请参阅其中HtlTestSuite
的一个很好的例子。每个HtlTestNode
子类都有以下虚拟函数按需实现。在方法中按顺序触发这些public PerformTest()
方法。
public virtual int SetupTest() { return 0; } public virtual int PreProcessTest() { return 0; } public virtual int RunTest() { return 0; } public virtual int PostProcessTest() { return 0; } public virtual int ClearTest() { return 0; }