1515#ifndef RCLCPP__SERIALIZATION_HPP_
1616#define RCLCPP__SERIALIZATION_HPP_
1717
18- #include < rmw/rmw.h>
19-
2018#include < memory>
2119#include < string>
2220
23- #include " rcl/error_handling .h"
21+ #include " rosidl_runtime_c/message_type_support_struct .h"
2422
2523namespace rclcpp
2624{
2725
26+ class SerializedMessage ;
27+
2828// / Interface to (de)serialize a message
2929class SerializationBase
3030{
@@ -35,87 +35,32 @@ class SerializationBase
3535 /* *
3636 * \param[in] message The ROS2 message which is read and serialized by rmw.
3737 */
38- virtual std::shared_ptr<rcl_serialized_message_t > serialize_message (const void * message) = 0;
38+ virtual void serialize_message (
39+ const void * ros_message, SerializedMessage * serialized_message) const = 0;
3940
4041 // / Deserialize a serialized stream to a ROS message
4142 /* *
4243 * \param[in] serialized_message The serialized message to be converted to ROS2 by rmw.
4344 * \param[out] message The deserialized ROS2 message.
4445 */
4546 virtual void deserialize_message (
46- const rcl_serialized_message_t * serialized_message,
47- void * msg) = 0;
47+ const SerializedMessage * serialized_message, void * ros_message) const = 0;
4848};
4949
5050// / Default implementation to (de)serialize a message by using rmw_(de)serialize
5151class Serialization : public SerializationBase
5252{
5353public:
54- Serialization (
55- const rosidl_message_type_support_t & type_support,
56- const rcutils_allocator_t allocator = rcutils_get_default_allocator())
57- : type_support_(type_support), rcutils_allocator_(allocator)
58- {}
59-
60- std::shared_ptr<rcl_serialized_message_t > serialize_message (const void * message) override
61- {
62- auto serialized_message = new rcl_serialized_message_t ;
63- *serialized_message = rmw_get_zero_initialized_serialized_message ();
64- const auto ret = rmw_serialized_message_init (serialized_message, 0 , &rcutils_allocator_);
65- if (ret != RCUTILS_RET_OK) {
66- throw std::runtime_error (
67- " Error allocating resources for serialized message: " +
68- std::string (rcutils_get_error_string ().str ));
69- }
70-
71- if (nullptr == message) {
72- delete serialized_message;
73- throw std::runtime_error (" Message is nullpointer while serialization." );
74- }
75-
76- const auto error = rmw_serialize (
77- message,
78- &type_support_,
79- serialized_message);
80- if (error != RCL_RET_OK) {
81- delete serialized_message;
82- throw std::runtime_error (" Failed to serialize." );
83- }
84-
85- auto shared_serialized_msg = std::shared_ptr<rcl_serialized_message_t >(
86- serialized_message,
87- [](rcl_serialized_message_t * msg) {
88- auto fini_ret = rmw_serialized_message_fini (msg);
89- delete msg;
90- if (fini_ret != RCL_RET_OK) {
91- RCUTILS_LOG_ERROR_NAMED (
92- " rclcpp" ,
93- " Failed to destroy serialized message: %s" , rcl_get_error_string ().str );
94- }
95- });
96-
97- return shared_serialized_msg;
98- }
54+ Serialization (const rosidl_message_type_support_t & type_support);
9955
100- void deserialize_message (const rcl_serialized_message_t * serialized_message, void * msg) override
101- {
102- if (nullptr == serialized_message ||
103- serialized_message->buffer_capacity == 0 ||
104- serialized_message->buffer_length == 0 ||
105- !serialized_message->buffer )
106- {
107- throw std::runtime_error (" Failed to deserialize nullptr serialized message." );
108- }
56+ void serialize_message (
57+ const void * ros_message, SerializedMessage * serialized_message) const override ;
10958
110- const auto ret = rmw_deserialize (serialized_message, &type_support_, msg);
111- if (ret != RMW_RET_OK) {
112- throw std::runtime_error (" Failed to deserialize serialized message." );
113- }
114- }
59+ void deserialize_message (
60+ const SerializedMessage * serialized_message, void * ros_message) const override ;
11561
11662private:
11763 rosidl_message_type_support_t type_support_;
118- rcutils_allocator_t rcutils_allocator_;
11964};
12065
12166} // namespace rclcpp
0 commit comments