繁体   English   中英

将现有的FlatBuffers对象添加到FlatBufferBuilder C#

[英]Add existing FlatBuffers object to FlatBufferBuilder C#

我有两个表都包含一个环境表

table Environment {
windDirection:int = 0;
windMagnitude:int = 0;
windVariation:int = 0;
rain:ushort = 0;
snow:ushort = 0;
dust:ushort = 0;
fog:ushort = 0;
}

table REQUEST_SCENARIO_CHANGE_ENVIRONMENT_M {
   scenarioId:string;
   environment:Environment;
}

enum SCENARIO_CHANGE_ENVIRONMENT_RESULT_E : byte {
  SUCCESS,
  CLIENT_DOESNT_CONTROL_SCENARIO,
  SCENARIO_NOT_IN_FREE_MODE, // scenario was not setup-free'd
  SCENARIO_NOT_FOUND,
  UNKNOWN_FAILURE
}

table RESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M {
   result:SCENARIO_CHANGE_ENVIRONMENT_RESULT_E;
   environment:Environment;
}

顾名思义,第一个表是由许多控制客户端之一发出并发送到服务器的请求。 服务器以错误代码(结果)响应。 如果结果为SUCESS,则将RESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M发送给所有客户端。 这样,如果每个环境都成功更改了一个环境,就会收到有关该事实的警报。

我的问题是,由于我在创建RESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M的代码中已经有一个适当填充的Environment对象,是否可以

     var message = Message.GetRootAsMessage(Utilities.ByteBuffer(data.Data));
     var request = REQUEST_SCENARIO_CHANGE_ENVIRONMENT_M.GetRootAsREQUEST_SCENARIO_CHANGE_ENVIRONMENT_M(Utilities.ByteBuffer(message.GetPayloadBytes()));
     SCENARIO_CHANGE_ENVIRONMENT_RESULT_E result = SCENARIO_CHANGE_ENVIRONMENT_RESULT_E.UNKNOWN_FAILURE;
     Scenario scenario = GetScenarioFromId(request.ScenarioId);
     if (scenario == null)
     {
        result = SCENARIO_CHANGE_ENVIRONMENT_RESULT_E.SCENARIO_NOT_FOUND;
     }
     else
     {
        if (!scenario.IsController(message.SessionToken))
        {
           result = SCENARIO_CHANGE_ENVIRONMENT_RESULT_E.CLIENT_DOESNT_CONTROL_SCENARIO;
        }
        else if (scenario.EndScenario() == STS_ERRORS.ERR_NO_ERROR)
        {
           // TODO: Unit Test
           result = SCENARIO_CHANGE_ENVIRONMENT_RESULT_E.SUCCESS;
        }
        else
        {
           // TODO: Unit Test
           result = SCENARIO_CHANGE_ENVIRONMENT_RESULT_E.UNKNOWN_FAILURE;
        }
     }
     FlatBuffers.FlatBufferBuilder fbb = new FlatBuffers.FlatBufferBuilder(1024);
     IOSServer.IOSCore.Messages.Environment.StartEnvironment(fbb);

     RESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M.StartRESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M(fbb);
     RESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M.AddResult(fbb, result);
     RESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M.AddEnvironment(fbb, request.Environment);
        var response = RESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M.EndRESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M(fbb);
     fbb.Finish(response.Value);
     // If the scenario is not able to be ended. Only respond to the originator
     if (result != SCENARIO_CHANGE_ENVIRONMENT_RESULT_E.SUCCESS)
     {
        EventData responseData = new EventData(Utilities.GetMessageBytes(fbb, DataType.RESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M, Utilities.UniqueId(), 0, message.RequestId));// TODO: Timestamp
        Mediator.GetInstance().RaiseEvent(responseData);
     }
     else // Otherwise, send to all scenario members
     {
        EventData responseData = new EventData(Utilities.GetMessageBytes(fbb, DataType.RESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M, Utilities.UniqueId()));// TODO: Timestamp
        Mediator.GetInstance().RaiseEvent(responseData, sendToAllExternalClients: true);
        _scenarios.Remove(request.ScenarioId);
     }

问题是

RESPONSE_SCENARIO_CHANGE_ENVIRONMENT_M.AddEnvironment(fbb, request.Environment);

是否可以从Environment获取FlatBuffers.Offset<Environment>

通常无法将表从一个FlatBuffer复制到另一个,除非使用C ++中的reflection::CopyTable (或使用对象API)。

由于所有表及其依赖项都需要驻留在同一缓冲区中,并且需要通过偏移量进行访问,因此需要复制(不能简单地引用)它。

就目前而言,在C#中,唯一的解决方案是编写自己的CopyEnvironment函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM