Существует ли стандартный / хорошо разработанный способ сериализации классов Java для использования в C ++ без использования формата разметки, такого как XML или JSON? - PullRequest
2 голосов
/ 20 марта 2012

Я работаю над проектом, который в конечном итоге будет включать объекты Java с несколькими миллиардами полных полей, и некоторые расчеты за пределами конверта показывают, что стандартные методы сериализации быстро станут труднодоступными для входных данных такой длины (подумайтеконцертный файл JSON).Известны ли альтернативные методы?

Ответы [ 5 ]

1 голос
/ 21 марта 2012

Вы можете определить некоторую грамматику ASN.1 и кодировать / декодировать ваши данные, используя общие правила кодирования, например, DER, PER и т. Д.

Эта гибкая запись используется в большинстве распространенных протоколов по TCP, таких как LDAP.Это может быть наиболее эффективный способ взаимодействия с различными платформами, но вам необходимо изучить некоторые основы asn.1 и определить грамматику.Затем внедрите маршаллеры / демаршаллеры в Java, а также в C ++.

Проверьте ASN.1 в Википедии

Проверьте также Bouncy Castle

1 голос
/ 21 марта 2012

Я бы, вероятно, использовал формат Sun XDR.Это двоичный код, поэтому в качестве отправной точки для размера используйте размер 1/3 rd размера текстовых форматов.Хотя они (насколько мне известно) не включены в дистрибутив Java, есть несколько библиотек для создания / чтения этого формата на Java и C ++.Поскольку он используется в ONC RPC от Sun, протокол (и, по крайней мере, некоторые реализации библиотек) тестировался * в течение многих лет.Он также стандартизирован в RFC 4506 , поэтому вы можете быть настолько независимы от Oracle, насколько считаете нужным.

1 голос
/ 21 марта 2012

взгляните на буфер протокола Если у вас есть коллекция объектов и вы не ожидаете ни одного сообщения (например, большого xml), оно может работать.

0 голосов
/ 23 марта 2012

Вы можете попробовать ASN.1 (да, я знаю, что кто-то уже предлагал это здесь, но у меня есть некоторая дополнительная информация, чтобы добавить).Поскольку вы обеспокоены размером данных, обратите внимание, что телефонные операторы используют ASN.1 для обработки своих CDR (записей данных о вызовах) при обработке счетов за телефонные звонки (будь то через наземные линии или мобильные телефоны).Они объединяют сотни или тысячи записей о вызовах в одно сообщение, которое поступает в их биллинговые центры.

Я бы предложил использовать PER (правила упакованного кодирования), который был изначально разработан для авиационной отрасли в связи с их потребностью всведение к минимуму пропускной способности в связи воздух-земля.Впоследствии PER был подхвачен индустрией мобильной телефонии, где он в настоящее время является частью многих протоколов 3G и 4G.

Цель PER - не передавать информацию по проводам, о которой обе стороны уже знают.Так, например, если поле имеет фиксированную длину, нет необходимости отправлять длину в сообщении.Если значение имеет диапазон, например, от 5000 до 5007, существует только 8 возможных значений, поэтому для представления этого значения будут использоваться только 3 бита.Это часть того, почему PER достигает такой компактности.

Наконец, использование хорошего инструмента ASN.1 избавляет вас от необходимости беспокоиться о деталях, упомянутых в предыдущем абзаце.Все, что вам нужно сделать, это создать спецификацию ASN.1, описывающую информацию, которую вы хотели бы обменять (что легко сделать - см. ASN.1 Made Simple ), выбрать язык программирования (C, C ++,Java, C # являются одними из распространенных, но другие также доступны в некоторых инструментах ASN.1), затем используйте компилятор ASN.1 для генерации механизма сериализатора / десериализации для вас.Обратите внимание, что, поскольку сама ASN.1 не зависит от используемого вами языка программирования, вы можете легко сериализовать в C ++ и десериализовать в Java или наоборот.

Вы можете найти список инструментов ASN.1 (некоторые бесплатные,некоторые коммерческие) по следующему адресу: http://www.itu.int/ITU-T/asn1/links/index.htm

0 голосов
/ 20 марта 2012

Вы можете написать собственную реализацию Serializable для ваших объектов Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...