分布式Server:IDL_DataReader

源程序:【免费】分布式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

通用点和差异点

  • 通用点:两个类都实现了相同的接口(takeread 和 take_next_sample),并且都使用 CDR 进行数据的反序列化。
  • 差异点:它们处理的数据类型不同(Grade vs AverageGrade),这意味着它们的 UnMarshal 方法可能有所不同,因为不同的数据类型可能需要不同的解析逻辑。

注意事项

  • 内存管理:在代码中,每次创建 CDR 对象后都进行了 delete 操作,这很好。但是,需要确保在调用 UnMarshal 方法期间不会抛出异常,否则可能会导致内存泄漏。同样,userDataVector[i].pData 也被 delete 了,需要确保这不会违反其他部分的内存管理逻辑。
  • 异常安全:考虑到异常安全,最好是使用智能指针(如 std::unique_ptr 或 std::shared_ptr)来自动管理内存,这样可以减少内存泄漏的风险。
  • 字节顺序:在创建 CDR 对象时,指定了字节顺序(MY_BYTE_SEX),这对于跨平台数据交换至关重要。确保发送方和接收方使用相同的字节顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值