介绍
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<bool>
(ref ptrCurrNode, "m_myBool", ref m_myBool, false);
intReturn &= HtlMemVar.SetMemVar<int>
(ref ptrCurrNode, "m_myInt01", ref m_myInt01, false);
intReturn &= HtlMemVar.SetMemVar<double>
(ref ptrCurrNode, "m_myDouble04", ref m_myDouble04, false);
intReturn &= HtlMemVar.SetMemVar<string>
(ref ptrCurrNode, "m_myString", ref m_myString, false);
//Sub Object Member Variables
if (blnWithSubObjects)
{
intReturn &= HtlMemVar.SetMemVar<TestObj01>
(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<bool>
(ref ptrCurrNode, "m_myBool", ref m_myBool);
intReturn &= HtlMemVar.GetMemVar<int>
(ref ptrCurrNode, "m_myInt01", ref m_myInt01);
intReturn &= HtlMemVar.GetMemVar<double>
(ref ptrCurrNode, "m_myDouble04", ref m_myDouble04);
intReturn &= HtlMemVar.GetMemVar<string>
(ref ptrCurrNode, "m_myString", ref m_myString);
intReturn &= HtlMemVar.GetMemVar<TestObj01>
(ref ptrCurrNode, "m_myTestObj", ref m_myTestObj);
return intReturn;
}
该Save
方法的第一件事是调用父类的Save
方法。然后,继续设置该类的所有成员变量。在这种情况下,有一个bool
,一个int
,一double
,一个string
类型,并且一个子对象TestObj01
,其也从继承HtlBase
。注意在s TestObj01
的布尔检查中print sub object
。成员变量的设置是通过调用HtlMemVar.SetMemVar<T>()
方法来实现的。您传入对当前节点的引用,该string
成员变量的名称以及对该对象的引用。注意所有的基础对象成员变量都被blnWithSubObjects
设置为false
。
同样,该Load
方法调用父类Load
,然后继续调用交互GetMemVar<T>
函数。应该指出的是,同时拥有Save
一个Load
方法和一个方法的原因是有时开发人员希望只写成员变量(比如GUID
s)。该系统也适用于HTL中的所有容器。这是一个HtlVector
序列化的例子。
intReturn &= HtlMemVar.SetMemVar<HtlVector<TestObj01>>
(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; }