2014-12-09 3 views
2

저는 플러그인 아키텍처를 만들고 있습니다. 사용자는 자신 만의 플러그인을 만들 수 있으며, 사용자가 자신의 플러그인 설정을 protobuf에 넣을 수 있도록 허용합니다 (사용자 유형을 알지 못합니다).protobuf-net의 동적 protobuf 메시지

PROTOS 메시지 :

message pbPlugin{ 
    required string id = 1; 
    required string type = 2; 
    optional bytes settings = 3; 
    optional bytes settings_descriptor= 4; 
} 

message pbMyPluginSetting{ 
    optional double exposure=1; 
    optional int32 pixel_clock=2; 
} 

서버 측 (C++) :

int main(int argc, char *argv[]) 
{ 
pbPlugin* pb_plugin; 

pbMyPluginSetting plugin_settings; //it's user class i don't know it 
plugin_settings.set_exposure(7); 
plugin_settings.set_pixel_clock(28); 

void *plugin_settings_buffer = malloc(plugin_settings.ByteSize()); 
plugin_settings.SerializeToArray(plugin_settings_buffer , plugin_settings.ByteSize()); 

pbPlugin->set_settings(plugin_settings_buffer , plugin_settings.ByteSize()); 

const Descriptor* desc=plugin_settings.GetDescriptor(); 
void *plugin_settings_desc_buffer = malloc(desc.ByteSize()); 
plugin_settings.SerializeToArray(plugin_settings_desc_buffer , desc.ByteSize()); 

pbPlugin->settings_descriptor(plugin_settings_desc_buffer , desc.ByteSize()); 
} 

그래서 사용자가 자신의 protobuf 메시지를 제작하고 그가 그것을 직렬화하고 그가 pbPlugin의 제기 설정을에 넣어됩니다 또한이 메시지 설명자를 직렬화합니다.

이제 클라이언트 측 (C# 응용 프로그램)에서 내 pbPlugin 메시지가 다시 전송되고 설정 필드를 deserialize하고 노출을 변경하고 pixel_clock을 변경하려고합니다. 내 문제는 형식을 모른 채 메시지를 어떻게 deserialize 할 수 있는지 모르겠다는 것입니다. protobuf-net에서 가능합니까?

C++에서 나는 직렬화 복원 설정을 넣어 메시지를 만들 내가 직렬화했습니다 기술자 및 DynamicMessageFactory을 사용합니다.

DynamicMessageFactory dmf; 
Message* actual_msg = dmf.GetPrototype(deserialized_descriptor)->New(); 

내가 액세스 필드의 값을 변경할 수 있습니다이 방법을. 어떻게 그것을 얻을 수 있습니까 protobuf-net?

답변

0

추가 조사 후이 문제에 대한 해결책을 찾았습니다. 안타깝게도 protobuf-net에서는 가능하지 않지만 protobuf-sharp-port에서는 꽤 쉽습니다. 나는 라이브러리를 대체했고 거기에서 이와 같이 파일 설명자에 접근 할 수있다.

-get 파일 설명 :

global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto fdp= global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto.ParseFrom(settings_descriptors); 

-get 메시지 설명 :

Google.ProtocolBuffers.DynamicMessage dynamic_message = Google.ProtocolBuffers.DynamicMessage.GetDefaultInstance(descriptor); 

그것을 가진 사람을 도움이 될 것입니다 희망 :
global::Google.ProtocolBuffers.Descriptors.MessageDescriptor descriptor= fdp.MessageTypes[0]; 

및 동적 메시지를 얻을 수 있습니다 거기에서

같은 문제.

관련 문제