{"id":313839,"date":"2020-11-26T15:01:42","date_gmt":"2020-11-26T15:01:42","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=313839"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=313839","title":{"rendered":"\u0410 \u0432\u044b \u0443\u043c\u0435\u0435\u0442\u0435 \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c nested_flatbuffers?"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0423 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 <i>FlatBuffers<\/i> \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0435, \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u044b\u0440\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0430\u043a\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438\/\u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u2014 <code>nested_flatbuffers<\/code>. <\/p>\n<p>  \u041f\u0440\u0430\u0432\u0434\u0430, \u043a\u0430\u043a \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432, \u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u0438\u043b \u0438\u043c \u0443\u0436\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0418 \u0434\u0430\u0436\u0435 \u043d\u0430 \u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u043e\u0440\u0443\u043c\u0430\u0445 \u0442\u0438\u043f\u0430 <i>stackoverflow<\/i>, <i><a href=\"https:\/\/groups.google.com\/g\/flatbuffers\/c\/aP74NvqwNpw?pli=1\" rel=\"nofollow\">groups.google<\/a><\/i> \u0438 \u0442.\u043f. \u0441\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u2014 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u043e \u043a\u0440\u0443\u043f\u0438\u0446\u0430\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0430\u0441\u0442\u0438 \u043f\u0430\u0437\u0437\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u0434.<\/p>\n<p>  \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u043a\u0440\u043e\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0430 C, C++ \u0438 Rust.<\/p>\n<blockquote><p>In concept this is very simple: a nested buffer is just a chunk of binary data stored in a ubyte vector, typically with some convenience methods generated to access a stored buffer. <a href=\"https:\/\/github.com\/dvidelabs\/flatcc\/blob\/master\/doc\/binary-format.md#nested-flatbuffers\" rel=\"nofollow\"><b>In praxis it adds a lot of complexity.<\/b><\/a><\/p><\/blockquote>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ff\/ta\/_6\/ffta_6auft5wutihyxqlhe39qs8.gif\" alt=\"image\" width=\"400\"><br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>Intro<\/h2>\n<p>  \u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e \u0441\u0435\u0442\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u044d\u043a\u0435\u043d\u0434 \u043d\u0430 C, \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 C++, \u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u043d\u0430 JS? \u041e\u0434\u043d\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u2014 Protocol Buffers (\u0438\u043b\u0438 <a href=\"https:\/\/developers.google.com\/protocol-buffers\" rel=\"nofollow\">Protobuf<\/a>) \u0438 FlatBuffers (<a href=\"https:\/\/google.github.io\/flatbuffers\" rel=\"nofollow\">FB<\/a>), \u043e\u0431\u0435 \u043e\u0442 Google. <\/p>\n<p>  \u041a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e? \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043e \u0441\u0445\u0435\u043c\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u0433\u0434\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0417\u0430\u0442\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u044b \u043d\u0430 \u043d\u0443\u0436\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u043d\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442: \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u043c\u0435\u0442\u043e\u0434\u044b), \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f <i>\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/i> \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0444\u0435\u0440 \u0442\u0438\u043f\u0430 <code>uint8_t*<\/code>. \u042d\u0442\u043e\u0442 \u0431\u0443\u0444\u0444\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0443\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e \u0441\u0435\u0442\u0438, \u0438 \u043d\u0430 \u043f\u0440\u0438\u0451\u043c\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e <i>\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/i>.<br \/>  <i>\u0414\u043b\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0438<\/i>: \u0443 Protobuf \u0441\u0445\u0435\u043c\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <i>.proto<\/i>, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u2013 <i>protoc<\/i>; \u0443 FlatBuffers \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0444\u0430\u0439\u043b\u044b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c <i>.fbs<\/i>, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <i>flatc<\/i>.<\/p>\n<p>  \u0418 \u0445\u043e\u0442\u044f FlatBuffers \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Protobuf \u2014 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u0432 2014 \u0433\u043e\u0434\u0443 \u043f\u0440\u043e\u0442\u0438\u0432 2008 \u0433\u043e\u0434\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0442\u0430\u043a\u0438\u0445, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u0430\u043a <code>CopyMessage<\/code>, \u0432\u043e FlatBuffers \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u043b\u0433\u043e \u043a\u0443\u0440\u0438\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b FB \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0432 \u043f\u043b\u0430\u043d\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\/\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041c\u0438\u043d\u0443\u0442\u043a\u0430 \u0441\u0430\u043c\u043e\u043b\u044e\u0431\u043e\u0432\u0430\u043d\u0438\u044f<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u043e\u043c \u0432 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0445\u043e\u0442\u044f \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b \u043e\u043f\u044b\u0442 \u0441 \u043e\u0431\u043e\u0438\u043c\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u044f \u0434\u0435\u043b\u0430\u043b \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f Protobuf \u043d\u0430 wxPython \u2014 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e-\u0447\u0430\u0441\u044b \u0434\u0435\u0431\u0430\u0433\u0430 \u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043e\u0442 \u044d\u0442\u0430 \u0432\u043e\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f, \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f\u2026 <s>\u0432\u0441\u0451, \u043a\u0430\u043a \u0432\u044b \u043b\u044e\u0431\u0438\u0442\u0435<\/s>. \u0411\u044b\u0432\u0448\u0438\u0435 \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u043a\u0441\u0442\u0430\u0442\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u0443\u0441\u043f\u0435\u0445 \u0447\u0442\u043e \u043b\u0438.  <\/div>\n<\/p><\/div>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043f\u043b\u044e\u0441\u044b-\u043c\u0438\u043d\u0443\u0441\u044b \u044d\u0442\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u2014 \u0437\u0430 \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043b\u044e\u0434\u0438 \u0438 \u043d\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437: \u043e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e <a href=\"https:\/\/codeburst.io\/json-vs-protocol-buffers-vs-flatbuffers-a4247f8bda6f\" rel=\"nofollow\">\u043e\u0431\u0437\u043e\u0440\u0430<\/a> \u0434\u043e \u0446\u0435\u043b\u043e\u0439 <a href=\"https:\/\/www.ida.liu.se\/~nikca89\/papers\/networking20c.pdf\" rel=\"nofollow\">\u043d\u0430\u0443\u0447\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>. \u0417\u0434\u0435\u0441\u044c \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c FlatBuffers, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435: \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u043e\u0433\u043e \u044d\u0442\u043e \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c.<\/p>\n<h2>Problem Setting<\/h2>\n<p>  \u041e\u0431\u044b\u0447\u043d\u043e \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435), \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 (\u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f, \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440) \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0432 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 <code>union<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:<\/p>\n<p>  \u0424\u0430\u0439\u043b <i>client.fbs<\/i>:<\/p>\n<pre><code class=\"plaintext\">namespace my_project.client;  table Request {     name:string; }  table Response {     x:int;     y:int;     z:int; }  union CommonMessage {     Request,     Response }  table Message {     content:CommonMessage; }  root_type Message; <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0442\u0438\u043f <code>Message<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 \u00abclient_reader.h\u00bb, \u00abclient_builder.h\u00bb \u0438 \u00abclient_verifier.h\u00bb \u0434\u043b\u044f C, \u0434\u043b\u044f C++ \u2014 \u0432 \u00abclient_generated.h\u00bb \u0438 \u0442.\u0434.<\/p>\n<p>  \u0412 \u0447\u0435\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430? \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>Response<\/code>, \u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u0441\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  \u0424\u0430\u0439\u043b <i>server.fbs<\/i>:<\/p>\n<pre><code class=\"plaintext\">namespace my_project.server; table Response {     extra_info: string;     data: my_project.client.Response; } <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 <code>my_project.client.Response<\/code> \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0445\u043e\u0442\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c <code>my_project.server.Response<\/code> \u043a\u0443\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0430\u043b\u044c\u0448\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u043d\u0430 JS). \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a (\u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 C++):<\/p>\n<pre><code class=\"cpp\">void processClientResponse(const my_project::client::Response* msg) {     flatbuffers::FlatBufferBuilder fbb;     auto clientResponse = my_project::client::CreateResponse(fbb, msg-&gt;x(), msg-&gt;y(), msg-&gt;z());     auto extraInfo = fbb.CreateString(&quot;SomeInfo&quot;);     auto serverResp = my_project::server::CreateResponse(fbb, extraInfo, clientResponse); \/\/\u2026 } <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 <code>clientResponse<\/code>? \u041c\u044b \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0437\u0430\u043d\u043e\u0432\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438! \u041f\u0440\u0438\u0447\u0435\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0432 \u043d\u043e\u0432\u043e\u0435. \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a: <code>auto clientResponse {*msg}<\/code> \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>msg<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e?<\/p>\n<p>  \u0423\u0432\u044b, \u043d\u043e \u0442\u0430\u043a \u0445\u043e\u0440\u043e\u0448\u043e \u0436\u0438\u0442\u044c API \u0444\u043b\u044d\u0442\u0431\u0443\u0444\u0444\u0435\u0440\u043e\u0432 \u043d\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442. <\/p>\n<p>  \u0410 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043d\u0430 C, \u043e\u0442\u043a\u0443\u0434\u0430 \u0442\u0430\u043c \u0432\u0437\u044f\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0443 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/eh\/1z\/ti\/eh1ztivuliiy7_zqatimwmbchym.png\" width=\"550\"><\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0432 \u0447\u0451\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c:<\/p>\n<ul>\n<li><i>\u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/i> \u2014 \u043d\u0430\u0434\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e<\/li>\n<li><i>\u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430<\/i> \u2014 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0433\u043e\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0432 \u043d\u043e\u0432\u043e\u0435. \u042f \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0442\u0438\u043f\u043e\u043c <code>Response<\/code>: \u043d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044f \u0441\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438, \u0430 \u0438\u0445 \u0435\u0449\u0451 \u0438 \u043c\u043d\u043e\u0433\u043e \u2014 \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u043e \u043d\u043e\u0432\u043e\u0439, \u0434\u0430 \u0435\u0449\u0451 \u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f! \u0411\u0440\u0440\u0440, \u043c\u044b \u0440\u0430\u0437\u0432\u0435 \u0437\u0430 \u044d\u0442\u0438\u043c \u0437\u0434\u0435\u0441\u044c, \u0432 IT?<\/li>\n<li><i>\u043f\u0430\u043c\u044f\u0442\u044c<\/i> \u2014 \u043f\u043e \u0441\u0443\u0442\u0438 \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0432\u043d\u0443\u0442\u0440\u0438 <code>Message<\/code> \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438-\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/li>\n<\/ul>\n<p>  \u0418 \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0445\u043e\u0434?<\/p>\n<h2>Attribute nested_flatbuffers<\/h2>\n<p>  \u041d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u2014 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0438\u043f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442\u043e\u0432 <code>[ubyte]<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>nested_flatbuffers<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0442\u0438\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e\u2026 \u043d\u0443 \u043f\u043e\u0447\u0442\u0438. \u0422\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u0441\u0445\u0435\u043c\u0435 <i>client.fbs<\/i>:<\/p>\n<pre><code class=\"plaintext\">union CommonMessage {     Request,     Response }  table MessageHolder {     data: CommonMessage; }  table Message {     content: [ubyte](nested_flatbuffer: &quot;MessageHolder&quot;); } <\/code><\/pre>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f <code>MessageHolder<\/code>, \u0438 \u043c\u044b \u043d\u0435 \u043c\u043e\u0433\u043b\u0438 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e <code>CommonMessage<\/code>? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <code>nested_flatbuffer<\/code> <a href=\"https:\/\/github.com\/dvidelabs\/flatcc\/issues\/51#issuecomment-314739400\" rel=\"nofollow\">\u043d\u0435 \u043c\u043e\u0436\u0435\u0442<\/a> \u0438\u043c\u0435\u0442\u044c \u0442\u0438\u043f <i>union<\/i>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u0430 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0430\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0430. <\/p>\n<p>  \u0425\u043e\u0440\u043e\u0448\u043e, \u0443 \u043d\u0430\u0441 \u0442\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>Message<\/code>: \u043d\u043e \u043a\u0430\u043a \u0443\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>content<\/code>? <br \/>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 <i>enum<\/i> <code>Type<\/code>, \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>Header<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432 \u0442\u0438\u043f\u0435 <code>Message<\/code>. \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <code>Type<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 <code>CommonMessage<\/code>. <\/p>\n<p>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>Header<\/code> \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430, \u043d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0434\u043e\u0431\u043d\u0430, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0451.<\/p>\n<p>  \u0424\u0430\u0439\u043b <i>client.fbs<\/i> (\u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u043a\u0438):<\/p>\n<pre><code class=\"plaintext\">\/\/ \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u044b \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 enum Type:ubyte {     request,     response } table Header {     type: Type; } table Message {     header: Header;     content: [ubyte](nested_flatbuffer: &quot;MessageHolder&quot;); } <\/code><\/pre>\n<p>  \u041a\u0440\u0443\u0442\u043e! \u0410 \u043a\u0430\u043a \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f?<\/p>\n<h2>It&#8217;s coding time<\/h2>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u043c\u044b \u0434\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0434\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u2014 \u0430 \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u043e\u0432\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430? \u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u043e\u043b\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0431\u0435\u0437 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0445 \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439, \u2014 \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0439 \u0438\u0434\u0435\u0438.<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 C<\/h3>\n<p>  \u0412 C \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 FB: \u044d\u0442\u043e \u043d\u0435 \u041e\u041e\u041f \u044f\u0437\u044b\u043a, \u0443 \u043d\u0435\u0433\u043e \u0434\u0430\u0436\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u0440\u0443\u0433\u043e\u0439 \u2013 <code>flatcc<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0431\u0449\u0435\u0433\u043e <code>flatc<\/code> (\u0438 <a href=\"https:\/\/github.com\/dvidelabs\/flatcc\/issues\/1\" rel=\"nofollow\">\u043d\u0435 \u0432\u0441\u0435\u043c<\/a> \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u043e\u0431\u043d\u043e). \u0410 \u0435\u0449\u0451 \u043d\u0430 C \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u0434\u043b\u044f \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430:<br \/>  <code>#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(my_project_client, x)<\/code>.<\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u043b\u0441\u044f \u044f \u043d\u0430 <a href=\"https:\/\/github.com\/dvidelabs\/flatcc\/blob\/master\/test\/monster_test\/monster_test.c#L2341\" rel=\"nofollow\">\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/a> \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u043d\u0430 <a href=\"https:\/\/github.com\/dvidelabs\/flatcc\/issues\/51\" rel=\"nofollow\">\u044d\u0442\u043e\u043c<\/a> \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;client_builder.h&quot; #include &quot;client_verifier.h&quot; #include &lt;stdio.h&gt;  int main(int argc, char ** argv) {     printf(&quot;Testing on C\\n&quot;);      \/\/ builder \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0444\u0435\u0440     flatbuffers_builder_t builder;     flatcc_builder_init(&amp;builder);      size_t size = 0;     void* buf;     {         createRequest(&amp;builder);         buf = flatcc_builder_finalize_aligned_buffer(&amp;builder, &amp;size);         receiveBuffer(buf, size);         flatcc_builder_aligned_free(buf);     }     {         flatcc_builder_reset(&amp;builder);         createResponse(&amp;builder);         buf = flatcc_builder_finalize_aligned_buffer(&amp;builder, &amp;size);         receiveBuffer(buf, size);         flatcc_builder_aligned_free(buf);     }     flatcc_builder_clear(&amp;builder);     return 0; }  void createRequest(flatbuffers_builder_t* builder) {     ns(Type_enum_t) type = ns(Type_request);     ns(Header_ref_t) header = ns(Header_create(builder, type));     ns(Message_start_as_root(builder));         ns(Message_header_create(builder, type));         ns(Message_content_start_as_root(builder));             flatbuffers_string_ref_t name = flatbuffers_string_create_str(builder, &quot;This is some string for tests!&quot;);             ns(Request_ref_t) request = ns(Request_create(builder, name));             ns(CommonMessage_union_ref_t) msg_union = ns(CommonMessage_as_Request(request));             ns(MessageHolder_data_add(builder, msg_union));         ns(Message_content_end_as_root(builder));     ns(Message_end_as_root(builder)); }  void createResponse(flatbuffers_builder_t* builder) {     ns(Type_enum_t) type = ns(Type_response);     ns(Header_ref_t) header = ns(Header_create(builder, type));     ns(Message_start_as_root(builder));         ns(Message_header_create(builder, type));         ns(Message_content_start_as_root(builder));             ns(Response_ref_t) response = ns(Response_create(builder, 2, 3, 9));             ns(CommonMessage_union_ref_t) msg_union = ns(CommonMessage_as_Response(response));             ns(MessageHolder_data_add(builder, msg_union));         ns(Message_content_end_as_root(builder));     ns(Message_end_as_root(builder)); } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0444\u0435\u0440\u0430 \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void receiveBuffer(void* buf, size_t size) {     const int verification_result = ns(Message_verify_as_root(buf, size));     if (flatcc_verify_error_ok != verification_result) {         printf(&quot;Unable to verify flatbuffer message\\n&quot;);     }     ns(Message_table_t) msg = ns(Message_as_root(buf));     ns(Header_table_t) header = ns(Message_header(msg));     ns(Type_enum_t) type = ns(Header_type(header));     printf(&quot;Received Type: %u\\n&quot;, type);     switch(type) { \tcase ns(Type_request): \t    processRequest(&amp;msg); \t    break; \tcase ns(Type_response): \t    processResponse(&amp;msg); \t    break; \tdefault:    \t    printf(&quot;Unknown type!\\n&quot;); \t} }  void processRequest(ns(Message_table_t)* msg) {     ns(MessageHolder_table_t) content = ns(Message_content_as_root(*msg));     ns(Request_table_t) request = (ns(Request_table_t)) ns(MessageHolder_data(content));     const char* name = ns(Request_name(request));     printf(&quot;Result request: %s\\n&quot;, name); }  void processResponse(ns(Message_table_t)* msg) {     ns(MessageHolder_table_t) content = ns(Message_content_as_root(*msg));     ns(Response_table_t) response = (ns(Response_table_t)) ns(MessageHolder_data(content));     int x = ns(Response_x(response));     int y = ns(Response_y(response));     int z = ns(Response_z(response));     printf(&quot;Result response: %d.%d.%d\\n&quot;, x, y, z); } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>receiveBuffer<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u043c\u043e\u0433\u0443\u0442 \u0441\u044a\u0435\u0445\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0441\u043b\u043e\u043c\u0430\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0444\u0435\u0440. <\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 C++<\/h3>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;flatbuffers\/flatbuffers.h&quot; #include &quot;client_generated.h&quot; #include &quot;server_generated.h&quot; #include &lt;iostream&gt; namespace cli = my_project::client; namespace srv = my_project::server;  void createRequest(flatbuffers::FlatBufferBuilder&amp; fbb) {     auto type = cli::Type::request;     auto header = cli::CreateHeader(fbb, type);      flatbuffers::FlatBufferBuilder fbb2;     auto name = fbb2.CreateString(&quot;This is some string for tests!&quot;);     auto rq = cli::CreateRequest(fbb2, name);     auto data = cli::CreateMessageHolder(fbb2, cli::CommonMessage::Request, rq.Union());     fbb2.Finish(data);      auto content = fbb.CreateVector(fbb2.GetBufferPointer(), fbb2.GetSize());     auto msg = cli::CreateMessage(fbb, header, content);     cli::FinishMessageBuffer(fbb, msg); }   void createResponse(flatbuffers::FlatBufferBuilder&amp; fbb) {     auto type = cli::Type::response;     auto header = cli::CreateHeader(fbb, type);      flatbuffers::FlatBufferBuilder fbb2;     auto rp = cli::CreateResponse(fbb2, 2, 3, 9);     auto data = cli::CreateMessageHolder(fbb2, cli::CommonMessage::Response, rp.Union());     fbb2.Finish(data);      auto content = fbb.CreateVector(fbb2.GetBufferPointer(), fbb2.GetSize());     auto msg = cli::CreateMessage(fbb, header, content);     cli::FinishMessageBuffer(fbb, msg); } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0444\u0435\u0440\u0430 \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void receiveBuffer(std::uint8_t* buf, std::size_t size) {     flatbuffers::Verifier verifier(buf, size);     if (!cli::VerifyMessageBuffer(verifier))     {         std::cerr &lt;&lt; &quot;Unable to verify flatbuffer message\\n&quot;;         return;     }      auto msg = cli::GetMessage(buf);     auto header = msg-&gt;header();     auto type = header-&gt;type();     std::cout &lt;&lt; &quot;Received HeaderType from client: &quot; &lt;&lt; static_cast&lt;uint16_t&gt;(type) &lt;&lt; &quot;\\n&quot;;      switch (type)     {         case cli::Type::request:             processRequest (msg);             break;         case cli::Type::response:             processResponse(msg);             break;     } }  void processRequest(const cli::Message* msg) {     auto content = msg-&gt;content_nested_root();     auto rq = content-&gt;data_as_Request();     auto name = rq-&gt;name();     std::cout &lt;&lt; &quot;Result request: &quot; &lt;&lt; name-&gt;str() &lt;&lt;&quot;\\n&quot;; }  void processResponse(const cli::Message* msg) {     auto content = msg-&gt;content_nested_root();     auto rp = content-&gt;data_as_Response();     auto x = rp-&gt;x();     auto y = rp-&gt;y();     auto z = rp-&gt;z();     std::cout &lt;&lt; &quot;Result response: &quot; &lt;&lt; x &lt;&lt; &quot;.&quot;  &lt;&lt; y &lt;&lt; &quot;.&quot; &lt;&lt; z &lt;&lt;&quot;\\n&quot;; } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041a\u043e\u0434 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 \u043e\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 C, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u2014 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 <code>fbb2<\/code> \u0442\u0438\u043f\u0430 <code>FlatBufferBuilder<\/code> \u0434\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0437\u0430\u044f\u0432\u043b\u044f\u044e\u0442, \u0447\u0442\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0444\u043b\u044d\u0442\u0431\u0443\u0444\u0444\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c <a href=\"https:\/\/github.com\/dvidelabs\/flatcc\/blob\/master\/doc\/builder.md#nested-buffers\" rel=\"nofollow\">\u0438 \u0442\u0430\u043a, \u0438 \u0442\u0430\u043a<\/a>, \u043d\u043e \u0432 C \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c (\u0430 \u0436\u0430\u043b\u044c \u2014 c\u043e \u0432\u0442\u043e\u0440\u044b\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c \u0431\u0438\u043b\u0434\u0435\u0440\u0430 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u0435\u0435).<\/p>\n<h3>Level Up<\/h3>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0443\u0436\u043d\u043e? \u041a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 <code>nested_flatbuffers<\/code>? <\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 C++-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<p>  \u0424\u0430\u0439\u043b <i>server.fbs<\/i>:<\/p>\n<pre><code class=\"plaintext\">include &quot;client.fbs&quot;; namespace my_project.server;  table ClientData {     extra_info:string;     client_msg:[ubyte](nested_flatbuffer: &quot;my_project.client.MessageHolder&quot;); }  table ServerData {     server_name:string; }  union CommonMessage {     ServerData,     ClientData }  table Message {     header: my_project.client.Header;     content: CommonMessage; }  root_type Message; <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0442\u043e\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>Message<\/code>, \u043d\u043e \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e <i>union<\/i> \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438. \u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 <code>ClientData<\/code>: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0441\u043b\u0430\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u00ab\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0444\u043b\u044d\u0442\u0431\u0443\u0444\u0444\u0435\u0440\u00bb <code>client_msg<\/code> \u2014 \u0438 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c <i>\u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435<\/i> \u0442\u0438\u043f\u0430, \u0447\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u043a\u043b\u0438\u0435\u043d\u0442. \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0435\u0433\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u044f (\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f \u0434\u0435\u043b\u0430\u043b \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438, \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u2014 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0432 \u043a\u043e\u0434\u0435):<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">example.cpp<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">\/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b  flatbuffers::FlatBufferBuilder fbb_; \/\/ \u043e\u0431\u0449\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 void processClientMessage(const cli::Message* msg) {     fbb_.Clear();     \/\/ constructing srv::Message from cli::Message     switch (msg-&gt;header()-&gt;type())     {         case cli::Type::request:             forwardMessage(msg, &quot;SERVER-REQUEST&quot;);             break;          case cli::Type::response:             forwardMessage(msg, &quot;SERVER-RESPONSE&quot;);             break;     }     \/\/ processing constructed srv::Message to verify it is correct     processServerMessage(); }  \/\/ \u0421\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2013 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0431\u0435\u0437 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 void forwardMessage(const cli::Message* msg, const char* extra_info_str) {     \/\/ Yes, we should recreate header as FlatBuffers don't have API to just copy it from msg-&gt;header()     auto header = cli::CreateHeader(fbb_, msg-&gt;header()-&gt;type());      auto extra_info = fbb_.CreateString(extra_info_str);      \/\/ The main part: copying nested buffer from client to server message     auto client_msg = msg-&gt;content();     auto client_msg_vec = fbb_.CreateVector(client_msg-&gt;Data(), client_msg-&gt;size());      auto content = srv::CreateClientData(fbb_, extra_info, client_msg_vec);      auto server_msg = srv::CreateMessage(fbb_, header, srv::CommonMessage::ClientData, content.Union());     srv::FinishMessageBuffer(fbb_, server_msg); }  \/\/ \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c void processServerMessage() const {     std::uint8_t* buf = fbb_.GetBufferPointer();     auto msg = srv::GetMessage(buf);      auto header = msg-&gt;header();     auto header_type = header-&gt;type();     auto content_type = msg-&gt;content_type();      std::cout &lt;&lt; &quot;Received HeaderType from server: &quot; &lt;&lt; static_cast&lt;uint16_t&gt;(header_type) &lt;&lt; &quot;\\n&quot;;     std::cout &lt;&lt; &quot;Received ContentType from server: &quot; &lt;&lt; static_cast&lt;uint16_t&gt;(content_type) &lt;&lt; &quot;\\n&quot;;      if (content_type != srv::CommonMessage::ClientData)     {         std::cerr &lt;&lt; &quot;Not implemented Handler for this content_type\\n&quot;;         return;     }      \/\/ process only ClientData for demonstration purposes     auto content = msg-&gt;content_as_ClientData();     auto extra_info = content-&gt;extra_info();     auto client_msg = content-&gt;client_msg_nested_root();      std::cout &lt;&lt; &quot;Result request from server: extra_info: &quot; &lt;&lt; extra_info-&gt;str() &lt;&lt; &quot;\\n&quot;;      switch(header_type)     {         case cli::Type::request:         {             auto client_rq = client_msg-&gt;data_as_Request();             auto client_name = client_rq-&gt;name();             std::cout &lt;&lt; &quot;- client_msg: &quot; &lt;&lt; client_name-&gt;str() &lt;&lt; &quot;\\n&quot;;             break;         }          case cli::Type::response:         {             auto client_rp = client_msg-&gt;data_as_Response();             auto x = client_rp-&gt;x();             auto y = client_rp-&gt;y();             auto z = client_rp-&gt;z();             std::cout &lt;&lt; &quot;- client_msg: &quot; &lt;&lt; x &lt;&lt; &quot;.&quot; &lt;&lt; y &lt;&lt; &quot;.&quot; &lt;&lt; z &lt;&lt; &quot;\\n&quot;;             break;         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0435\u0449\u0451 \u0440\u0430\u0437 \u0445\u043e\u0447\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u043a\u0446\u0435\u043d\u0442 \u043d\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438: <\/p>\n<pre><code class=\"cpp\">auto client_msg = msg-&gt;content(); auto client_msg_vec = fbb_.CreateVector(client_msg-&gt;Data(), client_msg-&gt;size()); <\/code><\/pre>\n<p>  \u0418 \u0432\u0441\u0451! \u041d\u0435 \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0435\u0439, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043a \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e \u0432 <code>msg-&gt;content()<\/code> \u2014 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0440\u0451\u043c \u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u044b\u0440\u043e\u0439 \u0431\u0443\u0444\u0444\u0435\u0440 \u043a\u0430\u043a \u0435\u0441\u0442\u044c. <\/p>\n<p>  \u041a\u0440\u0430\u0441\u0438\u0432\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<h2>Bonus<\/h2>\n<p>  \u0422\u0430\u043a \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0434\u043b\u044f \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 Rust. \u0421\u043e\u0433\u043b\u0430\u0441\u0435\u043d, \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e, \u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435\u0442. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f\u0437\u044b\u043a \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0431\u043e\u0440\u043e\u0442\u044b, \u0438 \u0443\u0436\u0435 \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0438\u043c \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442 C++. <s>\u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043f\u0430\u0441\u0435\u043d\u044b!<\/s> \u041a\u043e\u0440\u043e\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, who knows<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">main.rs<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"rust\">extern crate flatbuffers;  #[allow(dead_code, unused_imports, non_snake_case)] #[path = &quot;..\/..\/fbs\/client_generated.rs&quot;] mod client_generated; pub use client_generated::my_project::client::{     get_root_as_message,     Type,     Request,     Response,     Header,     CommonMessage,     MessageHolder,     Message,     RequestArgs,     ResponseArgs,     HeaderArgs,     MessageHolderArgs,     MessageArgs};  fn create_request(mut builder: &amp;mut flatbuffers::FlatBufferBuilder) { \/\/ \u0432 Rust \u0441\u043b\u043e\u0432\u043e type \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 _     let type_ = Type::request;     let header = Header::create(&amp;mut builder, &amp;mut HeaderArgs{type_});      let data_builder = {         let mut b = flatbuffers::FlatBufferBuilder::new();          let name = b.create_string(&quot;This is some string for tests!&quot;);         let rq = Request::create(&amp;mut b, &amp;RequestArgs{name: Some(name)});          let data = MessageHolder::create(&amp;mut b, &amp;MessageHolderArgs{             data_type: CommonMessage::Request,             data: Some(rq.as_union_value())});          b.finish(data, None);         b     };      let content = builder.create_vector(data_builder.finished_data());      let msg = Message::create(&amp;mut builder, &amp;MessageArgs{         header: Some(header),         content: Some(content)});      builder.finish(msg, None); }  fn create_response(mut builder: &amp;mut flatbuffers::FlatBufferBuilder) {     let type_ = Type::response;     let header = Header::create(&amp;mut builder, &amp;mut HeaderArgs{type_});      let data_builder = {         let mut b = flatbuffers::FlatBufferBuilder::new();         let rp = Response::create(&amp;mut b, &amp;ResponseArgs{x: 2, y: 3, z: 9});          let data = MessageHolder::create(&amp;mut b, &amp;MessageHolderArgs{             data_type: CommonMessage::Response,             data: Some(rp.as_union_value())});          b.finish(data, None);         b     };      let content = builder.create_vector(data_builder.finished_data());      let msg = Message::create(&amp;mut builder, &amp;MessageArgs{         header: Some(header),         content: Some(content)});      builder.finish(msg, None); }  fn process_request(msg: &amp;Message) {     let content = msg.content_nested_flatbuffer().unwrap();     let rq = content.data_as_request().unwrap();     let name = rq.name().unwrap();     println!(&quot;Result request: {:?}&quot;, name); }  fn process_response(msg: &amp;Message) {     let content = msg.content_nested_flatbuffer().unwrap();     let rp = content.data_as_response().unwrap();     println!(&quot;Result response: {}.{}.{}&quot;, rp.x(), rp.y(), rp.z()); }  fn receive_buffer(buf: &amp;[u8]) {     \/\/ NOTE: no verification exists in Rust yet     let msg = get_root_as_message(buf);     let header = msg.header().unwrap();     let type_ = header.type_();     println!(&quot;Received Type: {:?}&quot;, type_);      match type_ {         Type::request =&gt; {             process_request(&amp;msg);         }          Type::response =&gt; {             process_response(&amp;msg);         }     } }  fn main() {     println!(&quot;Testing on Rust&quot;);      let mut builder = flatbuffers::FlatBufferBuilder::new_with_capacity(1024);     {     \tcreate_request(&amp;mut builder);     \tlet buf = builder.finished_data(); \treceive_buffer(&amp;buf);     }     {     \tbuilder.reset();     \tcreate_response(&amp;mut builder);     \tlet buf = builder.finished_data(); \treceive_buffer(&amp;buf);     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h2>FIN<\/h2>\n<p>  \u0410\u0442\u0440\u0438\u0431\u0443\u0442 <code>nested_flatbuffers<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 FlatBuffers. \u0414\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u043b\u043e, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0441\u0445\u043e\u0434\u0443, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c.<\/p>\n<p>  \u0412\u043e\u043e\u0431\u0449\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0442\u0435\u0445 \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u0438\u043d\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0436\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435\u0433\u043e. \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0442\u0430\u043a\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u043c, \u0438 \u043f\u043e \u0441\u0443\u0442\u0438 \u043d\u0430 \u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043e \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0441\u0438\u043b, \u0447\u0435\u043c \u043d\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u044d\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0440\u0435\u0434\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u041f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043c\u0438\u043c\u043e <code>nested_flatbuffers<\/code> \u043e\u0431\u0441\u0442\u043e\u0438\u0442 \u0434\u0435\u043b\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/dvidelabs\/flatcc#custom-allocation\" rel=\"nofollow\">\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u0432<\/a> \u0432 C: \u00ab\u0414\u0430, \u044e\u0437\u0435\u0440\u044b, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0430\u0436 \u0434\u0432\u0443\u043c\u044f (2!) \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043c\u044b \u0432\u0430\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0434\u0430\u0434\u0438\u043c. \u0410 \u0437\u0430\u0447\u0435\u043c?! \u041a\u0443\u0440\u0438\u0442\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438\u00bb *<i>\u0437\u0432\u0443\u043a\u0438 trolololo<\/i> <br \/>  \u0422\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u0434\u0440\u0443\u0433 \u043e\u0437\u0430\u0434\u0430\u0447\u0438\u0442\u0435\u0441\u044c \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043d\u0430\u0442\u043a\u043d\u0451\u0442\u0435\u0441\u044c \u043d\u0430 \u043c\u043e\u0451 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0444\u043e\u0440\u0443\u043c\u043e\u0432, \u2014 \u0436\u0430\u043b\u044c \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0438\u0445 \u043e\u0442\u0432\u0435\u0442 \u0431\u044b\u043b \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0439, \u043d\u043e \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439.  <\/div>\n<\/p><\/div>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0436\u0435\u043b\u0430\u0442\u044c \u0432\u0430\u043c \u043f\u043e\u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0430 \u0435\u0449\u0451 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435 \u0436\u0430\u043b\u0435\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u043e\u0432 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u2014 \u043c\u044b \u0436\u0435 \u0432\u0435\u0434\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u043f\u043e \u0446\u0435\u0445\u0443, \u0434\u0430?<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/529846\/\"> https:\/\/habr.com\/ru\/post\/529846\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0423 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 <i>FlatBuffers<\/i> \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0435, \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u044b\u0440\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0430\u043a\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438\/\u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u2014 <code>nested_flatbuffers<\/code>. <\/p>\n<p>  \u041f\u0440\u0430\u0432\u0434\u0430, \u043a\u0430\u043a \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432, \u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u0438\u043b \u0438\u043c \u0443\u0436\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0418 \u0434\u0430\u0436\u0435 \u043d\u0430 \u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u043e\u0440\u0443\u043c\u0430\u0445 \u0442\u0438\u043f\u0430 <i>stackoverflow<\/i>, <i><a href=\"https:\/\/groups.google.com\/g\/flatbuffers\/c\/aP74NvqwNpw?pli=1\" rel=\"nofollow\">groups.google<\/a><\/i> \u0438 \u0442.\u043f. \u0441\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u2014 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u043e \u043a\u0440\u0443\u043f\u0438\u0446\u0430\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0430\u0441\u0442\u0438 \u043f\u0430\u0437\u0437\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u0434.<\/p>\n<p>  \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u043a\u0440\u043e\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0430 C, C++ \u0438 Rust.<\/p>\n<blockquote><p>In concept this is very simple: a nested buffer is just a chunk of binary data stored in a ubyte vector, typically with some convenience methods generated to access a stored buffer. <a href=\"https:\/\/github.com\/dvidelabs\/flatcc\/blob\/master\/doc\/binary-format.md#nested-flatbuffers\" rel=\"nofollow\"><b>In praxis it adds a lot of complexity.<\/b><\/a><\/p><\/blockquote>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ff\/ta\/_6\/ffta_6auft5wutihyxqlhe39qs8.gif\" alt=\"image\" width=\"400\">  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-313839","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313839","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=313839"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313839\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=313839"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=313839"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=313839"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}