сопоставление с++ типов с byte-массивами
От: niXman Ниоткуда https://github.com/niXman
Дата: 01.03.16 16:20
Оценка:
привет!

название чудное получилось...

дано: некоторый составной тип, который сериализуется в byte-массив. каждый такой byte-массив кладется в очередь для последующей отправки.
проблема: допустим, в очередь положили несколько типов состоящих из двух int32. очередь не успела отправить все получившиеся byte-массивы, а мы добавляет в составной тип еще один int32. и тут начинается веселье, ибо в очереди оказываются два разных типа, которые требуют разной обработки на стороне получателя.

вопрос в том, как идентифицировать эти byte-массивы, точнее то, из чего они получаются?

составные типы могут содержать не только фундаментальные типы.

интерфейс к очереди у меня такой:
struct queue {
   void push(yas::shared_buffer buf); // https://github.com/niXman/yas/blob/master/include/yas/buffers.hpp#L67
   void pop();
   bool empty() const;
   yas::shared_buffer front();
};

т.е. queue ничего не знает о типах.

идей у меня две, и обе незаконченные:
1. сделать queue шаблонным, и далее как-то использовать параметр
2. в сериализуемый тип добавить метаинформацию

выскажитесь, пожалуйста, по сабжу.

спасибо!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: сопоставление с++ типов с byte-массивами
От: uzhas Ниоткуда  
Дата: 01.03.16 16:27
Оценка:
Здравствуйте, niXman, Вы писали:

X>проблема: допустим, в очередь положили несколько типов состоящих из двух int32. очередь не успела отправить все получившиеся byte-массивы, а мы добавляет в составной тип еще один int32.


Это вопрос о версионировании, об очереди или о сериализации? Предлагаю выкинуть очередь из вопроса и уточнить сам вопрос
Re: сопоставление с++ типов с byte-массивами
От: B0FEE664  
Дата: 01.03.16 17:19
Оценка:
Здравствуйте, niXman, Вы писали:

X>выскажитесь, пожалуйста, по сабжу.


Очередь, сериализация и протокол передачи — это три разных сущности и, наверное, их следует как-то выразить программными средствами.

У меня очередь параметризуется типом передаваемого сообщения ( queue<yas::shared_buffer> ), сериализацией и десериализацией занимаются отдельные наборы кодеков (оформленные в виде библиотек) которые запаковывают и распаковывают сообщения в соответствии с написанными в документации протоколами.

При этом есть ещё четвёртая сущность — события, которые уведомляют о наличии данных в очередях.
И каждый день — без права на ошибку...
Re: сопоставление с++ типов с byte-массивами
От: Mr.Delphist  
Дата: 01.03.16 17:39
Оценка:
Здравствуйте, niXman, Вы писали:

X>привет!


X>название чудное получилось...


X>дано: некоторый составной тип, который сериализуется в byte-массив. каждый такой byte-массив кладется в очередь для последующей отправки.

X>проблема: допустим, в очередь положили несколько типов состоящих из двух int32. очередь не успела отправить все получившиеся byte-массивы, а мы добавляет в составной тип еще один int32. и тут начинается веселье, ибо в очереди оказываются два разных типа, которые требуют разной обработки на стороне получателя.

Я бы поглядел в сторону Google.Protobuf или Apache Thrift, ибо проблема действительно не в очереди и байтах, а в прикладном уровне: если при сериализации такие проблемы, то представьте себе, что будет при ДЕсериализации.
Re: сопоставление с++ типов с byte-массивами
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.03.16 12:18
Оценка:
писал на ходу, не обдумав, потому и получился "поток сознания" =)

если кратко: для каждого сериализованого элемента нужен ID-типа, чтоб знать как десериализовать.
сериализацию пока сделал так:
struct message0 {
   static const std::uint32_t id = fnv1a("message0");

   int a;
   double b;
   string c;

   template<typename Archive>
   void serialize(Archive &ar) {
      ar & id
         & a
         & b
         & c;
   }
};


при десериализации извлекаю id и использую его в switch(id).
const std::uint32_t id = ...
switch ( id ) {
   case fnv1a("message0"): ...
   case fnv1a("message1"): ...
}
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: сопоставление с++ типов с byte-массивами
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.03.16 12:22
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>У меня очередь параметризуется типом передаваемого сообщения ( queue<yas::shared_buffer> )

если проект не закрытый, добавь плиз на него ссылку сюда: https://github.com/niXman/yas#projects-using-this-library
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: сопоставление с++ типов с byte-массивами
От: B0FEE664  
Дата: 02.03.16 15:30
Оценка:
Здравствуйте, niXman, Вы писали:

BFE>>У меня очередь параметризуется типом передаваемого сообщения ( queue<yas::shared_buffer> )

X>если проект не закрытый, добавь плиз на него ссылку сюда: https://github.com/niXman/yas#projects-using-this-library

Проект коммерческий и закрытый.
И каждый день — без права на ошибку...
Re[4]: сопоставление с++ типов с byte-массивами
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.03.16 19:28
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Проект коммерческий и закрытый.

та тоже сойдет...
дай просто ссылку на проект, я сам впишу.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[5]: сопоставление с++ типов с byte-массивами
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.03.16 21:12
Оценка:
Здравствуйте, niXman, Вы писали:

X>дай просто ссылку на проект, я сам впишу.

если это не секрет, конечно
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.