связь между 2 программами, написанными на разных языках - сериализация? - PullRequest
2 голосов
/ 18 апреля 2010

когда требуется сериализация, маршалинг и т. Д. Во время обмена данными между программами, расположенными на 2 разных машинах / в сети / в Интернете?

Предположим, у меня есть клиентская программа на java / flash и серверная программа на C. Разве я не могу реализовать коммуникацию, используя собственный протокол? Полагаю, что так. Когда необходима сериализация и т. Д. Я знаю, что Java RMI, CORBA и т. Д. Имеют эти механизмы. Но почему? Это обязательно? пожалуйста, просветите меня?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2010

Объекты в вашей программе имеют четко определенную структуру памяти, наложенную вашим компилятором. Но эта компоновка не будет точно такой же в другой программе, запущенной на другой машине, скомпилированной другим компилятором. И он обычно не очень совместим с транспортной средой, такой как сетевое соединение или файл. О котором вам нужно позаботиться, чтобы доставить объект с одной машины на другую.

Файлы и сетевые пакеты - это простые потоки байтов. Вот где сериализация вступает в игру, вам нужно сериализовать объект в памяти в поток байтов. И его необходимо десериализовать на принимающей стороне обратно из потока байтов в объект.

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

Было много решений этой проблемы. Они обычно включают в себя какие-то метаданные, которые описывают поля в объекте. Появление Unicode позволило поместить как метаданные, так и значения полей в текстовое описание, лучшим примером этого является XML.

1 голос
/ 18 апреля 2010

Не могу я реализовать коммуникацию, используя собственный протокол? Похоже поэтому.

Можно. Вы, вероятно, не должны изобретать велосипед. Сериализация сложна. Используйте хорошо проверенное стандартное решение для лучших результатов. Вы потратите гораздо меньше времени на изучение API, чем на написание процедур передачи данных.

Когда нужна сериализация и т. Д.?

Для начала необходимо перенести часть структуры памяти из одного процесса в другой.

Здесь описаны другие варианты использования: http://en.wikipedia.org/wiki/Serialization

Я знаю, что Java RMI, CORBA и т. Д. Имеют эти механизмы Но почему? Это обязательно? пожалуйста, просветите меня?

Ничто из этого "не обязательно", как вы сказали, вы можете написать свой собственный протокол. Вы (IMO) гораздо лучше полагаетесь на некоторые существующие технологии в этой области, такие как XML или другие, о которых вы упомянули. Какие технологии вы используете, действительно зависит от того, что вы пытаетесь сделать, поэтому я не буду спекулировать:)

Одним из отличных механизмов передачи сериализованных данных является Буферы протокола Google. Они заботятся о кодировании (гораздо более эффективным способом, чем XML) и преобразовании байтов.

0 голосов
/ 18 апреля 2010

Лучший способ сделать это в наши дни - отправлять XML-сообщения туда и обратно.

...