源程序:【免费】分布式grade:IDL-DataReader资源-CSDN文库
#include "IDL_DataReader1.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();
}
这段代码是一个使用Data Distribution Service (DDS) 的C++实现,特别是针对一个名为GradeDataReader
的类,这个类用于读取特定类型的数据——在这个例子中,是“成绩”数据。DDS是一种中间件技术,用于实时数据分发,广泛应用于需要高性能和低延迟的数据通信场景,如汽车、航空航天、军事等领域。
类构造函数和析构函数
GradeDataReader::GradeDataReader(DataReaderImpl * pDataReaderImpl)
:构造函数,接收一个指向DataReaderImpl
的指针作为参数。这个构造函数通过调用基类DataReader
的构造函数来初始化对象。GradeDataReader::~GradeDataReader()
:析构函数,用于清理对象。在这个例子中,析构函数为空,意味着没有特定的资源需要手动释放。
narrow
方法
GradeDataReader* GradeDataReader::narrow(DataReader* pDataReader)
:这个静态方法尝试将一个指向DataReader
的指针转换为指向GradeDataReader
的指针。如果转换成功,返回转换后的指针;如果pDataReader
为NULL
,则返回NULL
。这里的转换实际上没有进行类型检查,直接进行了强制类型转换,这在实际应用中可能会导致运行时错误,除非调用者确保传入的pDataReader
实际上是指向GradeDataReader
或其派生类的指针。
数据读取方法
-
ReturnCode_t GradeDataReader::take(GradeSeq & data_values, ...)
和ReturnCode_t GradeDataReader::read(GradeSeq & data_values, ...)
:这两个方法用于从数据读取器中获取数据。take
方法从底层缓冲区移除数据,而read
方法读取数据但不移除。这两个方法都接收一个GradeSeq
(一个序列,用于存储成绩数据)和其他参数,如最大样本数、样本状态等。它们首先将数据读取到一个中间格式(UserDataVector
),然后将这些数据反序列化(通过UnMarshal
方法)到GradeSeq
中。 -
ReturnCode_t GradeDataReader::take_next_sample(Grade& receivedData, SampleInfo & sample_info)
:这个方法用于获取下一个可用的样本。它接收一个Grade
对象和一个SampleInfo
对象作为参数,用于存储获取的数据和样本信息。数据同样是通过反序列化从中间格式转换而来。
数据处理细节
- 在处理数据时,代码使用了
CDR
(Common Data Representation)进行数据的反序列化。CDR
是一种用于在异构系统之间交换数据的标准格式。在创建CDR
对象时,代码跳过了数据的前4个字节(可能是因为这些数据包含了元数据或其他不需要的信息),并且指定了字节序(MY_BYTE_SEX
)和版本(硬编码为1)。 - 在反序列化完成后,代码释放了用于存储中间格式数据的内存。
注意事项
- 这段代码直接进行了类型转换而没有进行类型检查,这在实际应用中可能会导致问题。
- 使用了硬编码的数值(如跳过前4个字节)和常量(如
MY_BYTE_SEX
),这可能会影响代码的可移植性和可维护性。 - 代码中没有错误处理逻辑,例如,在内存分配失败或反序列化出错时没有相应的处理。
ReturnCode_t
的构造函数被调用但没有传递任何参数,这意味着它可能默认表示成功。然而,这种用法没有提供关于操作结果的详细信息。