源程序:【免费】分布式Server:IDL-DataReader资源-优快云文库
#include "IDL_DataReader.h"
GradeDataReader::GradeDataReader(DataReaderImpl * pDataReaderImpl)
:DataReader(pDataReaderImpl)
{
}
GradeDataReader::~GradeDataReader()
{
}
GradeDataReader* GradeDataReader::narrow(DataReader* pDataReader)
{
if (!pDataReader)
return NULL;
GradeDataReader *aGradeDataReader = (GradeDataReader*)pDataReader;
return aGradeDataReader;
}
ReturnCode_t GradeDataReader::take(GradeSeq & data_values, SampleInfoSeq sample_infos, int max_samples, SampleStateKind sample_states, ViewStateKind view_states, InstanceStateKind instance_states)
{
UserDataVector userDataVector;
DataReader::take(userDataVector, sample_infos, max_samples, sample_states, view_states, instance_states);
data_values.ensure_length(userDataVector.size(), userDataVector.size());
for (int i = 0; i < userDataVector.size(); i++)
{
CDR* CDRData = new CDR((unsigned char *)userDataVector[i].pData + 4, userDataVector[i].ilength - 4, MY_BYTE_SEX, 1);
data_values[i].UnMarshal(CDRData);
if (CDRData)
delete CDRData;
delete userDataVector[i].pData;
}
return ReturnCode_t();
}
ReturnCode_t GradeDataReader::read(GradeSeq & data_values, SampleInfoSeq sample_infos, int max_samples, SampleStateKind sample_states, ViewStateKind view_states, InstanceStateKind instance_states)
{
UserDataVector userDataVector;
DataReader::read(userDataVector, sample_infos, max_samples, sample_states, view_states, instance_states);
data_values.ensure_length(userDataVector.size(), userDataVector.size());
for (int i = 0; i < userDataVector.size(); i++)
{
CDR* CDRData = new CDR((unsigned char *)userDataVector[i].pData + 4, userDataVector[i].ilength - 4, MY_BYTE_SEX, 1);
data_values[i].UnMarshal(CDRData);
if (CDRData)
delete CDRData;
delete userDataVector[i].pData;
}
return ReturnCode_t();
}
ReturnCode_t GradeDataReader::take_next_sample(Grade& receivedData, SampleInfo & sample_info)
{
UserData userData;
DataReader::take_next_sample(userData, sample_info);
CDR* CDRData = new CDR((unsigned char *)userData.pData + 4, userData.ilength - 4, MY_BYTE_SEX, 1);
receivedData.UnMarshal(CDRData);
if (CDRData)
{
delete CDRData;
}
return ReturnCode_t();
}
AverageGradeDataReader::AverageGradeDataReader(DataReaderImpl * pDataReaderImpl)
:DataReader(pDataReaderImpl)
{
}
AverageGradeDataReader::~AverageGradeDataReader()
{
}
AverageGradeDataReader* AverageGradeDataReader::narrow(DataReader* pDataReader)
{
if (!pDataReader)
return NULL;
AverageGradeDataReader *aAverageGradeDataReader = (AverageGradeDataReader*)pDataReader;
return aAverageGradeDataReader;
}
ReturnCode_t AverageGradeDataReader::take(AverageGradeSeq & data_values, SampleInfoSeq sample_infos, int max_samples, SampleStateKind sample_states, ViewStateKind view_states, InstanceStateKind instance_states)
{
UserDataVector userDataVector;
DataReader::take(userDataVector, sample_infos, max_samples, sample_states, view_states, instance_states);
data_values.ensure_length(userDataVector.size(), userDataVector.size());
for (int i = 0; i < userDataVector.size(); i++)
{
CDR* CDRData = new CDR((unsigned char *)userDataVector[i].pData + 4, userDataVector[i].ilength - 4, MY_BYTE_SEX, 1);
data_values[i].UnMarshal(CDRData);
if (CDRData)
delete CDRData;
delete userDataVector[i].pData;
}
return ReturnCode_t();
}
ReturnCode_t AverageGradeDataReader::read(AverageGradeSeq & data_values, SampleInfoSeq sample_infos, int max_samples, SampleStateKind sample_states, ViewStateKind view_states, InstanceStateKind instance_states)
{
UserDataVector userDataVector;
DataReader::read(userDataVector, sample_infos, max_samples, sample_states, view_states, instance_states);
data_values.ensure_length(userDataVector.size(), userDataVector.size());
for (int i = 0; i < userDataVector.size(); i++)
{
CDR* CDRData = new CDR((unsigned char *)userDataVector[i].pData + 4, userDataVector[i].ilength - 4, MY_BYTE_SEX, 1);
data_values[i].UnMarshal(CDRData);
if (CDRData)
delete CDRData;
delete userDataVector[i].pData;
}
return ReturnCode_t();
}
ReturnCode_t AverageGradeDataReader::take_next_sample(AverageGrade& receivedData, SampleInfo & sample_info)
{
UserData userData;
DataReader::take_next_sample(userData, sample_info);
CDR* CDRData = new CDR((unsigned char *)userData.pData + 4, userData.ilength - 4, MY_BYTE_SEX, 1);
receivedData.UnMarshal(CDRData);
if (CDRData)
{
delete CDRData;
}
return ReturnCode_t();
}
这段代码是关于数据读取的,特别是在数据分发服务(DDS,Data Distribution Service)或类似中间件环境下使用的。它定义了两种数据读取器:GradeDataReader
和 AverageGradeDataReader
,用于读取不同类型的数据(成绩和平均成绩)。
GradeDataReader
类
- 析构函数:标准的析构函数,用于清理资源,但在这个例子中并未展示具体资源清理的代码。
- narrow 函数:这是一个静态函数,用于将基类
DataReader
的指针或引用转换为GradeDataReader
类型的指针。这是DDS中常见的做法,用于在运行时确定具体的DataReader类型。 - take 函数:从数据源中批量获取成绩数据。它使用
DataReader
的take
方法获取原始数据,然后逐个解析这些数据到GradeSeq
序列中。解析是通过创建CDR
(Common Data Representation)对象完成的,这是一个用于数据序列化和反序列化的工具。 - read 函数:与
take
类似,但read
通常表示一种非破坏性读取,即读取的数据在下一次读取时仍然可用。 - take_next_sample 函数:获取下一个可用的成绩样本,并将其解析到
Grade
对象中。
AverageGradeDataReader
类
- 构造函数和析构函数:与
GradeDataReader
类似,用于初始化和清理资源。 - narrow 函数:与
GradeDataReader
的narrow
函数类似,用于将基类DataReader
的指针或引用转换为AverageGradeDataReader
类型的指针。 - take、read 和 take_next_sample 函数:这些函数的工作方式与
GradeDataReader
中的对应函数非常相似,不同之处在于它们处理的是AverageGrade
类型的数据而不是Grade
。
通用点和差异点
- 通用点:两个类都实现了相同的接口(
take
、read
和take_next_sample
),并且都使用CDR
进行数据的反序列化。 - 差异点:它们处理的数据类型不同(
Grade
vsAverageGrade
),这意味着它们的UnMarshal
方法可能有所不同,因为不同的数据类型可能需要不同的解析逻辑。
注意事项
- 内存管理:在代码中,每次创建
CDR
对象后都进行了delete
操作,这很好。但是,需要确保在调用UnMarshal
方法期间不会抛出异常,否则可能会导致内存泄漏。同样,userDataVector[i].pData
也被delete
了,需要确保这不会违反其他部分的内存管理逻辑。 - 异常安全:考虑到异常安全,最好是使用智能指针(如
std::unique_ptr
或std::shared_ptr
)来自动管理内存,这样可以减少内存泄漏的风险。 - 字节顺序:在创建
CDR
对象时,指定了字节顺序(MY_BYTE_SEX
),这对于跨平台数据交换至关重要。确保发送方和接收方使用相同的字节顺序。