Skip to content

Commit

Permalink
add deserializer
Browse files Browse the repository at this point in the history
  • Loading branch information
weisunglee committed Dec 19, 2018
1 parent 89ef7b1 commit a5156e6
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 3 deletions.
15 changes: 12 additions & 3 deletions demo/main.cpp
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
#include "demo.pb.h"
#include <iostream>
#include "message_serializer.h"
#include "message_deserializer.h"

int main()
{
demo::demo_message_int dmi;
dmi.set_data(100);
std::cout << dmi.data() << std::endl;
std::string dmi_serialized = proto::message_serializer::serialize(dmi);


demo::demo_message_string dms;
dms.set_data("hello world");

std::cout << dmi.data() << std::endl;
std::cout << dms.data() << std::endl;

std::string dmi_serialized = proto::message_serializer::serialize(dmi);
std::string dms_serialized = proto::message_serializer::serialize(dms);

auto dmi_deserialized = proto::message_deserializer::deserialize(dmi_serialized.c_str(), dmi_serialized.length());
auto dms_deserialized = proto::message_deserializer::deserialize(dms_serialized.c_str(), dms_serialized.length());

std::cout << std::dynamic_pointer_cast<demo::demo_message_int>(dmi_deserialized)->data() << std::endl;
std::cout << std::dynamic_pointer_cast<demo::demo_message_string>(dms_deserialized)->data() << std::endl;

return 0;
}
2 changes: 2 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ include_directories(../proto/)
set(LIB_PROTO_MESSAGE_SRC
message_serializer.h
message_serializer.cpp
message_deserializer.h
message_deserializer.cpp
)

add_library(lib_proto_message ${LIB_PROTO_MESSAGE_SRC})
32 changes: 32 additions & 0 deletions src/message_deserializer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include "message_deserializer.h"

namespace proto {
std::shared_ptr<google::protobuf::Message> message_deserializer::deserialize(const char* buf, size_t length) {
proto::proto_message proto_message;
proto_message.ParseFromArray(buf, length);

auto message = create_message(proto_message.type());

if(message){
message->ParseFromString(proto_message.payload());
}

return message;
}

std::shared_ptr<google::protobuf::Message> message_deserializer::create_message(const std::string& type_name) {
std::shared_ptr<google::protobuf::Message> message = nullptr;
auto descriptor = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(type_name);

if(descriptor) {
auto prototype = google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);

if(prototype) {
message = std::shared_ptr<google::protobuf::Message>(prototype->New());
}
}

return message;
}

} // proto
25 changes: 25 additions & 0 deletions src/message_deserializer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#ifndef MESSAGE_DESERIALIZER_H_
#define MESSAGE_DESERIALIZER_H_

#include "proto_message.pb.h"
#include <string>
#include <memory>

// forward declaration
namespace google {
namespace protobuf {
class Message;
}
}

namespace proto {
class message_deserializer {
public:
static std::shared_ptr<google::protobuf::Message> deserialize(const char* buf, size_t length);

private:
static std::shared_ptr<google::protobuf::Message> create_message(const std::string& type_name);
};
} // proto

#endif // MESSAGE_DESERIALIZER_H_

0 comments on commit a5156e6

Please sign in to comment.