{"id":4871,"date":"2023-12-10T07:48:47","date_gmt":"2023-12-10T06:48:47","guid":{"rendered":"https:\/\/www.aiknow.io\/limited-bandwidth-data-serialization\/"},"modified":"2023-12-10T07:48:48","modified_gmt":"2023-12-10T06:48:48","slug":"limited-bandwidth-data-serialization","status":"publish","type":"post","link":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/","title":{"rendered":"Limited Bandwidth Data Serialization"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"4871\" class=\"elementor elementor-4871 elementor-2938\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e54b3ff elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"e54b3ff\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-eadfc5d\" data-id=\"eadfc5d\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d1446d4 elementor-widget elementor-widget-heading\" data-id=\"d1446d4\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><h3 style=\"margin-bottom: 21.7882px;white-space: normal\">Solution for serialization and transmission of messages on limited-bandwidth channels<\/h3><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-27d52a3 elementor-widget elementor-widget-text-editor\" data-id=\"27d52a3\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>In this article we present a solution that we have implemented for serializing messages over a limited-bandwidth channel. This mechanism is based on the <a style=\"background-color: #ffffff;\" href=\"https:\/\/developers.google.com\/protocol-buffers\">Protocol Buffers<\/a> tool, developed by Google.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-6f4efb3\" data-id=\"6f4efb3\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d8f4252 elementor-widget elementor-widget-image\" data-id=\"d8f4252\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png\" data-elementor-open-lightbox=\"no\">\n\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"696\" height=\"400\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png\" class=\"attachment-large size-large wp-image-4872\" alt=\"\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png 696w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck-300x172.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck-360x207.png 360w\" sizes=\"(max-width: 696px) 100vw, 696px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f678791 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f678791\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9844139\" data-id=\"9844139\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5156507 elementor-widget elementor-widget-heading\" data-id=\"5156507\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">The Problem<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1bfb0be elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1bfb0be\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-55abd3e\" data-id=\"55abd3e\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-017bae9 elementor-widget elementor-widget-text-editor\" data-id=\"017bae9\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"letter-spacing: 0px;\">Suppose we have a system that foresees the exchange of highly important data packets from the field to a centralized application via<\/span> <span style=\"font-weight: bold; letter-spacing: 0px;\">limited bandwidth<\/span> <span style=\"letter-spacing: 0px;\">communication channels, where a limited number of bytes can be sent for each packet.<\/span> <\/p>\n<p><span style=\"letter-spacing: 0px;\">Furthermore, suppose that the data packets exchanged are of different types, and that some types of messages have variable size fields, such as text strings.<\/span><\/p>\n<p> In this scenario, it is likely that some messages have a length that exceeds the maximum size that can be sent on the communication channel.<span style=\"letter-spacing: 0px;\"><br \/><\/span><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-3d34aad\" data-id=\"3d34aad\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3985ba0 elementor-widget elementor-widget-text-editor\" data-id=\"3985ba0\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"letter-spacing: 0px;\">To be able to send all the possible messages created by the field or by the centralized application, it is essential to find a serialization modality that provides a certain degree of message compression and, furthermore, that can also handle the case in which the serialized message has a greater size than the transmission limit.<\/span><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d392b01 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d392b01\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8144116\" data-id=\"8144116\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-39ea9ad elementor-widget elementor-widget-heading\" data-id=\"39ea9ad\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">The Solution<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-522fd60 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"522fd60\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-1f0bba4\" data-id=\"1f0bba4\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3dd01ee elementor-widget elementor-widget-text-editor\" data-id=\"3dd01ee\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"letter-spacing: 0px;\">To solve the problem described in the previous point, we chose to use<\/span> <a style=\"background-color: #ffffff; letter-spacing: 0px;\" href=\"https:\/\/developers.google.com\/protocol-buffers\">Protocol Buffers<\/a>, <span style=\"letter-spacing: 0px;\">a binary serialization tool developed by Google which is capable of serializing typed and structured data, obtaining a simple array of bytes as output.<\/span><\/p>\n<p>The choice fell on this tool for a series of reasons.<\/p>\n<p> First of all, it is an open-source tool developed by Google, modern and currently widely used in various fields and applications due to its high flexibility and compact output size, compared to other serialization mechanisms such as JSON.<span style=\"letter-spacing: 0px;\"><br \/><\/span><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-6289ae8\" data-id=\"6289ae8\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4527903 elementor-widget elementor-widget-image\" data-id=\"4527903\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/share_serialization.png\" data-elementor-open-lightbox=\"no\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"671\" height=\"279\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/share_serialization.png\" class=\"attachment-large size-large wp-image-2875\" alt=\"Serializzazione ProtocolBuffer\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/share_serialization.png 671w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/share_serialization-300x125.png 300w\" sizes=\"(max-width: 671px) 100vw, 671px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ee5ae04 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ee5ae04\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-6b13581\" data-id=\"6b13581\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-fead74f elementor-widget elementor-widget-image\" data-id=\"fead74f\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/comparison.png\" data-elementor-open-lightbox=\"no\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"650\" height=\"377\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/comparison.png\" class=\"attachment-large size-large wp-image-2857\" alt=\"JSON-ProtocolBuffer comparison\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/comparison.png 650w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/comparison-300x174.png 300w\" sizes=\"(max-width: 650px) 100vw, 650px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-644099e\" data-id=\"644099e\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bfa7dc4 elementor-widget elementor-widget-text-editor\" data-id=\"bfa7dc4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Protocol Buffers offers serialization\/deserialization methods that are much more powerful than other technologies such as JSON or others.<\/p>\n<p> For example, the image to the left compares the serialization and deserialization processes of a message using JSON and Protocol Buffers, and compares the time taken to perform a single operation.<\/p>\n<p>Among the other advantages considered for this technology, we point out that Protocol Buffers is platform-independent, and supports a series of different languages \u200b\u200bsuch as C++, Java, C#, Kotlin, Python, etc\u2026<\/p><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4a2f553 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4a2f553\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-91f4d96\" data-id=\"91f4d96\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d78ce01 elementor-widget elementor-widget-text-editor\" data-id=\"d78ce01\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"letter-spacing: 0px;\">Finally, this mechanism works on typed and structured data, using self-generated classes based on description files that illustrate the structure of each type.<\/span><br><\/p>\n<p>These description files have an extension&nbsp;<code style=\"font-size: 14.4px;\">.proto<\/code>&nbsp;and contain the forma declaration of each message type. Based on the .proto necessary files,&nbsp;<code style=\"font-size: 14.4px;\">.proto<\/code>&nbsp;Protocol Buffers provides a compiler that generates the respective classes in the supported languages.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4758a3d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4758a3d\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ee7599a\" data-id=\"ee7599a\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6b76db8 elementor-widget elementor-widget-heading\" data-id=\"6b76db8\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span style=\"letter-spacing: 1.2px;white-space: normal\">Example<\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d9425e2 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d9425e2\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3c3d668\" data-id=\"3c3d668\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-41bd854 elementor-widget elementor-widget-heading\" data-id=\"41bd854\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span style=\"font-size: 32px;font-weight: 800;letter-spacing: 1.2px;white-space: normal\">Example .proto file definition<\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5b0a009 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5b0a009\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-da40ec6\" data-id=\"da40ec6\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-05d80bd elementor-widget elementor-widget-text-editor\" data-id=\"05d80bd\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Suppose, for example, that we need to serialize a class Person with Protocol Buffers that contains some information about a person:<\/p>\n<ul>\n<li>Name<\/li>\n<li>Last name<\/li>\n<li>Address<\/li>\n<li>email<\/li>\n<li>Telephone number<\/li>\n<\/ul>\n<p>The first step is to create a file Person.proto that describes this data structure (to the right).<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-1d30f58\" data-id=\"1d30f58\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3b026c4 elementor-widget elementor-widget-text-editor\" data-id=\"3b026c4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre><code>\/\/ Protocol Buffer declaration\nsyntax = \"proto3\";\npackage tutorial;\n\n\/\/ Java namespace declaration\noption java_package = \"com.example.tutorial.protos\";\n\nmessage Person {\n  uint32 ID = 1;\n  string NAME = 2;\n  string SURNAME = 3;\n  string ADDRESS = 4;\n  string EMAIL = 5;\n  string TEL = 6;\n}\n<\/code><\/pre><p> <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b97d994 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b97d994\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f1fe442\" data-id=\"f1fe442\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b9258be elementor-widget elementor-widget-text-editor\" data-id=\"b9258be\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>As we see, it is possible to describe the structure of the object using a series of types and setting an ordering\/numbering of its fields. The supported types, as well as the syntax, are described in the <a href=\"https:\/\/developers.google.com\/protocol-buffers\/docs\/proto3\" target=\"_blank\" rel=\"noopener\">official documentation.<\/a><\/p>\n<p>In particular, the data types made available by Protocol Buffers and the reference to the corresponding type in each of the supported languages \u200b\u200bare detailed.<\/p>\n<p>Optional fields, lists, generic types and enumerations, and nesting of types within other message types are also provided.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9b5a191 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9b5a191\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6a9d04b\" data-id=\"6a9d04b\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-eaf80c3 elementor-widget elementor-widget-text-editor\" data-id=\"eaf80c3\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"font-size: 32px; font-weight: 800; letter-spacing: 1.2px;\">Protocol Buffers Generation Classes<\/span><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-eb07aa4 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"eb07aa4\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-83ae568\" data-id=\"83ae568\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6ac92c0 elementor-widget elementor-widget-text-editor\" data-id=\"6ac92c0\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>After writing a .proto file, the next step, to be able to use the class within a project, is to generate the class in the required language. You must, therefore:<\/p>\n<p><i>Download the ProtoBuf compiler from the Protocol Buffers repository<\/i><\/p>\n<p>Launch the compiler indicating the proto file as input, the destination of the output file and the target language<br \/>For example, to obtain a Java class linked to the file Person.proto presented above, simply launch the command:<\/p>\n<p><i>protoc -I=$SRC_DIR &#8211;java_out=$DST_DIR $SRC_DIR\/Person.proto<\/i><\/p>\n<p>where $SRC_DIR indicates the base folder of the project and &#8211;java_out=$DST_DIR specifies to generate a class in the Java language and save it in the path $DST_DIR.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-247cac6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"247cac6\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c6bef63\" data-id=\"c6bef63\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ba03eab elementor-widget elementor-widget-heading\" data-id=\"ba03eab\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span style=\"letter-spacing: 1.2px;white-space: normal\">Serialization and reduced transmission size<\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f19a784 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f19a784\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5d10b02\" data-id=\"5d10b02\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cb0016c elementor-widget elementor-widget-text-editor\" data-id=\"cb0016c\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>However, returning to the problem illustrated at the beginning of the article, the use of Protocol Buffers (as well as any other serialization process) does not solve the constraint relating to the maximum size that can be sent for each message.<\/p>\n<p>For this reason it was necessary to think of a mechanism that not only used Protocol Buffer for serialization, but which also included fragmentation and reconstruction operations of a single message into multiple blocks that could respect the transmission limits imposed by the technology.<\/p>\n<p><span style=\"letter-spacing: 0px;\">We therefore thought of this solution, a single message is broken into many fragments based on the maximum size that can be sent on the channel and taking into account a number of header bytes added on to each packet<\/span><span style=\"letter-spacing: 0px;\">..<\/span><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6e6fbed elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6e6fbed\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3fb0f7d\" data-id=\"3fb0f7d\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0ac472b elementor-widget elementor-widget-heading\" data-id=\"0ac472b\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><h3 style=\"margin-bottom: 21.7882px;white-space: normal\">Content of Header Bytes<\/h3><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-688b728 elementor-section-content-top elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"688b728\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-8fe6598\" data-id=\"8fe6598\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d3506e6 elementor-widget elementor-widget-text-editor\" data-id=\"d3506e6\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>These header bytes are necessary because the message, once fragmented, must also be reconstructed on the other side, and for this operation a series of information useful for the reconstruction and recognition of these particular packets is necessary.<\/p>\n<ul>\n<li><span style=\"font-style: inherit; font-weight: inherit; background-color: var(--ast-global-color-5); color: var(--ast-global-color-3);\">The information we have provided is:<\/span><\/li>\n<li><span style=\"font-style: inherit; font-weight: inherit; background-color: var(--ast-global-color-5); color: var(--ast-global-color-3);\">A series of special ASCII characters as initiators of each packet, used to discriminate these packets from other communications sent<\/span><\/li>\n<li><span style=\"font-style: inherit; font-weight: inherit; background-color: var(--ast-global-color-5); color: var(--ast-global-color-3);\">An incremental ID that groups together all the fragments that are part of a single message<\/span><\/li>\n<li><span style=\"font-style: inherit; font-weight: inherit; background-color: var(--ast-global-color-5); color: var(--ast-global-color-3);\">The length of the fragment body in bytes<\/span><\/li>\n<li><span style=\"font-style: inherit; font-weight: inherit; background-color: var(--ast-global-color-5); color: var(--ast-global-color-3);\">The number of individual fragments (in the case of fragmentation into N packets, from 0 to N-1)<\/span><\/li>\n<li><span style=\"font-style: inherit; font-weight: inherit; background-color: var(--ast-global-color-5); color: var(--ast-global-color-3);\">The total number of fragments<\/span><\/li>\n<li><span style=\"font-style: inherit; font-weight: inherit; background-color: var(--ast-global-color-5); color: var(--ast-global-color-3);\">The reference class of the message that was serialized via Protocol Buffers<\/span><\/li>\n<\/ul>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-95bf219\" data-id=\"95bf219\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-be0945d elementor-widget elementor-widget-image\" data-id=\"be0945d\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/serialization.png\" data-elementor-open-lightbox=\"no\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"792\" height=\"870\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/serialization.png\" class=\"attachment-large size-large wp-image-2858\" alt=\"Limited bandwith serialization\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/serialization.png 792w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/serialization-273x300.png 273w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/serialization-768x844.png 768w\" sizes=\"(max-width: 792px) 100vw, 792px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d62bab8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d62bab8\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6cc9a02\" data-id=\"6cc9a02\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d10ec0d elementor-widget elementor-widget-text-editor\" data-id=\"d10ec0d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>One of the challenges encountered in the definition of this protocol was the choice of how to use the header bytes, in order to reduce the number of bytes reserved for storing this accessory information by as much as possible.<\/p>\n<p>At the same time, the header bytes must be sufficiently large enough to guarantee the possibility of fragmenting messages of different types without having too stringent of constraints on the maximum number of fragments that can be created.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5806724 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5806724\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a1f110a\" data-id=\"a1f110a\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cbdaa46 elementor-widget elementor-widget-heading\" data-id=\"cbdaa46\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span style=\"letter-spacing: 1.2px;white-space: normal\">Considerations<\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6a3eda5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6a3eda5\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9e1a70f\" data-id=\"9e1a70f\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-52f4fd4 elementor-widget elementor-widget-text-editor\" data-id=\"52f4fd4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Through this procedure we were able to transmit variable length information over a communication channel with constraints on the maximum payload size.<\/p>\n<p><span style=\"font-style: inherit; font-weight: inherit; background-color: var(--ast-global-color-5); color: var(--ast-global-color-3);\">Using Protocol Buffers we were able to execute performant and optimized serialization operations while maintaining the level of abstraction offered by the .proto description files.<\/span><\/p>\n<p><span style=\"font-style: inherit; font-weight: inherit; background-color: var(--ast-global-color-5); color: var(--ast-global-color-3);\">Finally, through our fragmentation mechanism, we overcame the constraint on the maximum size that can be transmitted on the communication channel.<\/span><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6a87d9a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6a87d9a\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5e4a77b\" data-id=\"5e4a77b\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-089ff67 elementor-widget elementor-widget-heading\" data-id=\"089ff67\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span style=\"letter-spacing: 1.2px;white-space: normal\">Use Cases<\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9b53848 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9b53848\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-227934d\" data-id=\"227934d\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3b0fb30 elementor-widget elementor-widget-text-editor\" data-id=\"3b0fb30\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>We used this system to exchange messages, communicating over a TETRA radio network, between Android devices in the field and a .NET Core application in cloud<\/p>\n<p><span style=\"font-weight: bold;\">TETRA<\/span> &#8211; <span style=\"font-weight: bold;\">TE<\/span>rrestrial <span style=\"font-weight: bold;\">T<\/span>runked <span style=\"font-weight: bold;\">RA<\/span>dio \u2013 is a professional two-way cellular radio system standardized by <a style=\"background-color: #ffffff;\" href=\"http:\/\/www.etsi.org\/technologies-clusters\/technologies\/tetra\">ETSI<\/a>.<\/p>\n<p>TETRA technology has been specifically designed for use by public administrations, emergency services, (police forces, firefighters, healthcare services, etc.) for public safety networks, for railway transportation and airport personnel as well as for military services.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-66412af\" data-id=\"66412af\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e5787d7 elementor-widget elementor-widget-text-editor\" data-id=\"e5787d7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Since they are aimed at these types of users,TETRA networks provide a high level of reliability and a series of connection modes to cover the greatest number of situations, including a Direct Mode which allows multiple radio devices to communicate with each other in the event of infrastructure failures.<\/p>\n<p>Specifically, the TETRA radio network with which we interfaced limits the size of the messages exchanged to a maximum of 255 bytes. Since the objective was to allow different types of messages with a larger size to transit, we used this serialization system, successfully verifying its performance and effectiveness.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Solution for serialization and transmission of messages on limited-bandwidth channels In this article we present a solution that we have implemented for serializing messages over a limited-bandwidth channel. This mechanism is based on the Protocol Buffers tool, developed by Google. The Problem Suppose we have a system that foresees the exchange of highly important data [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":4872,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[29],"tags":[],"class_list":["post-4871","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech-news-en"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Limited Bandwidth Data Serialization - AIknow<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Limited Bandwidth Data Serialization - AIknow\" \/>\n<meta property=\"og:description\" content=\"Solution for serialization and transmission of messages on limited-bandwidth channels In this article we present a solution that we have implemented for serializing messages over a limited-bandwidth channel. This mechanism is based on the Protocol Buffers tool, developed by Google. The Problem Suppose we have a system that foresees the exchange of highly important data [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/\" \/>\n<meta property=\"og:site_name\" content=\"AIknow\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-10T06:48:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-10T06:48:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png\" \/>\n\t<meta property=\"og:image:width\" content=\"696\" \/>\n\t<meta property=\"og:image:height\" content=\"400\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Michele Giovanelli\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michele Giovanelli\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/\"},\"author\":{\"name\":\"Michele Giovanelli\",\"@id\":\"https:\/\/www.aiknow.io\/en\/#\/schema\/person\/a989230a6d8434262e58f68af5c787c2\"},\"headline\":\"Limited Bandwidth Data Serialization\",\"datePublished\":\"2023-12-10T06:48:47+00:00\",\"dateModified\":\"2023-12-10T06:48:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/\"},\"wordCount\":1258,\"publisher\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png\",\"articleSection\":[\"Tech news\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/\",\"url\":\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/\",\"name\":\"Limited Bandwidth Data Serialization - AIknow\",\"isPartOf\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png\",\"datePublished\":\"2023-12-10T06:48:47+00:00\",\"dateModified\":\"2023-12-10T06:48:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#primaryimage\",\"url\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png\",\"contentUrl\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png\",\"width\":696,\"height\":400},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.aiknow.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Limited Bandwidth Data Serialization\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.aiknow.io\/en\/#website\",\"url\":\"https:\/\/www.aiknow.io\/en\/\",\"name\":\"AIknow - Developing future\",\"description\":\"From Edge To Intelligence\",\"publisher\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/#organization\"},\"alternateName\":\"AIknow\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.aiknow.io\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.aiknow.io\/en\/#organization\",\"name\":\"AIknow - Developing future\",\"url\":\"https:\/\/www.aiknow.io\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.aiknow.io\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2018\/06\/aiknow-logo_03.png\",\"contentUrl\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2018\/06\/aiknow-logo_03.png\",\"width\":1596,\"height\":348,\"caption\":\"AIknow - Developing future\"},\"image\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.aiknow.io\/en\/#\/schema\/person\/a989230a6d8434262e58f68af5c787c2\",\"name\":\"Michele Giovanelli\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.aiknow.io\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7b9c0585ded6217182119647f2db095a000ea01873a85bb505b114f1f33c5aee?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7b9c0585ded6217182119647f2db095a000ea01873a85bb505b114f1f33c5aee?s=96&d=mm&r=g\",\"caption\":\"Michele Giovanelli\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Limited Bandwidth Data Serialization - AIknow","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/","og_locale":"en_US","og_type":"article","og_title":"Limited Bandwidth Data Serialization - AIknow","og_description":"Solution for serialization and transmission of messages on limited-bandwidth channels In this article we present a solution that we have implemented for serializing messages over a limited-bandwidth channel. This mechanism is based on the Protocol Buffers tool, developed by Google. The Problem Suppose we have a system that foresees the exchange of highly important data [&hellip;]","og_url":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/","og_site_name":"AIknow","article_published_time":"2023-12-10T06:48:47+00:00","article_modified_time":"2023-12-10T06:48:48+00:00","og_image":[{"width":696,"height":400,"url":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png","type":"image\/png"}],"author":"Michele Giovanelli","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Michele Giovanelli","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#article","isPartOf":{"@id":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/"},"author":{"name":"Michele Giovanelli","@id":"https:\/\/www.aiknow.io\/en\/#\/schema\/person\/a989230a6d8434262e58f68af5c787c2"},"headline":"Limited Bandwidth Data Serialization","datePublished":"2023-12-10T06:48:47+00:00","dateModified":"2023-12-10T06:48:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/"},"wordCount":1258,"publisher":{"@id":"https:\/\/www.aiknow.io\/en\/#organization"},"image":{"@id":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#primaryimage"},"thumbnailUrl":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png","articleSection":["Tech news"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/","url":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/","name":"Limited Bandwidth Data Serialization - AIknow","isPartOf":{"@id":"https:\/\/www.aiknow.io\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#primaryimage"},"image":{"@id":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#primaryimage"},"thumbnailUrl":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png","datePublished":"2023-12-10T06:48:47+00:00","dateModified":"2023-12-10T06:48:48+00:00","breadcrumb":{"@id":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#primaryimage","url":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png","contentUrl":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2022\/05\/byte_bottleneck.png","width":696,"height":400},{"@type":"BreadcrumbList","@id":"https:\/\/www.aiknow.io\/en\/limited-bandwidth-data-serialization\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.aiknow.io\/en\/"},{"@type":"ListItem","position":2,"name":"Limited Bandwidth Data Serialization"}]},{"@type":"WebSite","@id":"https:\/\/www.aiknow.io\/en\/#website","url":"https:\/\/www.aiknow.io\/en\/","name":"AIknow - Developing future","description":"From Edge To Intelligence","publisher":{"@id":"https:\/\/www.aiknow.io\/en\/#organization"},"alternateName":"AIknow","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.aiknow.io\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.aiknow.io\/en\/#organization","name":"AIknow - Developing future","url":"https:\/\/www.aiknow.io\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.aiknow.io\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2018\/06\/aiknow-logo_03.png","contentUrl":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2018\/06\/aiknow-logo_03.png","width":1596,"height":348,"caption":"AIknow - Developing future"},"image":{"@id":"https:\/\/www.aiknow.io\/en\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.aiknow.io\/en\/#\/schema\/person\/a989230a6d8434262e58f68af5c787c2","name":"Michele Giovanelli","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.aiknow.io\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7b9c0585ded6217182119647f2db095a000ea01873a85bb505b114f1f33c5aee?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7b9c0585ded6217182119647f2db095a000ea01873a85bb505b114f1f33c5aee?s=96&d=mm&r=g","caption":"Michele Giovanelli"}}]}},"_links":{"self":[{"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/posts\/4871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/comments?post=4871"}],"version-history":[{"count":1,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/posts\/4871\/revisions"}],"predecessor-version":[{"id":4873,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/posts\/4871\/revisions\/4873"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/media\/4872"}],"wp:attachment":[{"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/media?parent=4871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/categories?post=4871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/tags?post=4871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}