Delphi: Перенос Объектов к удаленным компьютерам

Привет.

Я пишу программное обеспечение упорядочивания tier2 для использования сети. Таким образом, у нас есть клиент и сервер.

На клиенте я создаю Объекты TBest, в который Идентификатор продукта, сумма и пользователь, который приказывает, чтобы это было сохранено. (Таким образом, это - объект Порядка).

Порядок может иметь несколько объектов, и они сохраняются в массиве для позже отправления созданного заказа к серверу. Класс, который содержит массив, называют TBestellung.

Таким образом, я создал обоих

TBest.toString: string;

и

TBest.fromString(source: string): TBest;

Теперь, я отправляю результат toString на сервер через сокет, и на сервере я создаю объект с помощью fromString (его парсинг полученных атрибутов). Это работает, как предназначено.

Вопрос: существует ли лучший и более изящный способ сделать это? Сериализация является ключевым словом, да, но разве который не является ужасен / трудный, когда Вы сериализируете объект (TBestellung в этом случае), который содержит Массив других Объектов (TBest в этом случае)?

//Маленькая поправка: Прежде чем это спросят. Да я должен создать дополнительный (статический) класс для toString и fromString, потому что иначе сервер должен создать "пустой" TBest, чтобы смочь использовать fromString.

6
задан Acron 8 March 2010 в 22:37
поделиться

6 ответов

Существуют бесплатные библиотеки сериализации для Delphi (также для Free Pascal):

JSON и XML - это кроссплатформенные / кросс-языковые, которые могут быть полезны для будущих интерфейсов с другими системами, например, с веб-магазином на основе PHP. Они также являются бесплатными и открытыми стандартами (без привязки к поставщику)

. Обновление: я бы не стал использовать конструкторский подход, хотя вначале он может показаться тривиальным, (де) сериализация может стать сложным процессом, который добавит больше и больше кода, не зависящего от класса, для классов, которые нуждаются в сериализации. Вместо этого я бы использовал классы «построитель» / «синтаксический анализатор» (заводской шаблон), чтобы четкие обязанности и низкие зависимости были низкими.

6
ответ дан 8 December 2019 в 12:58
поделиться

Мы сериализуем объекты, используя базовый класс TStreamable. Эти классы предназначены только для передачи информации между уровнями / уровнями в клиент-серверном приложении DCOM.

Базовый класс знает, как сериализовать обычный поток Delphi из и в вариантный массив байтов. Методы интерфейса в интерфейсе DCOM принимают варианты параметров, в которых мы хотим передавать сложные объекты между клиентом и сервером.

Мы также синхронизируем наши клиентские и серверные версии, поэтому у нас нет проблем с управлением версиями между разными версиями клиента и сервера.

Таким образом, каждый подкласс просто читает и записывает в / из потока Delphi, а базовый класс сериализует это в вариант.

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

0
ответ дан 8 December 2019 в 12:58
поделиться

Нет, сериализация массива под-объектов внутри основного объекта не является особенно грязной или сложной, если код десериализации знает, как это прочитать. XML постоянно делает подобные вещи. Так же как и формат DFM, и это отлично работает.

Здесь нет никакой магии. Все данные, необходимые для воссоздания всего состояния объекта, должны быть переданы от отправителя к получателю тем или иным способом. Пока сериализатор и десериализатор используют один и тот же протокол, и получатель может воссоздать тот же объект, который отправил отправитель, ваш код работает нормально и не нуждается в доработке, если только он не вызывает значительных проблем с производительностью.

Также, в связи с вашей небольшой поправкой, если цель TBest.fromString - создать новый объект TBest, то он должен быть объявлен как конструктор, а не как статический объект. Это одна из замечательных вещей в Delphi: мы можем давать нашим конструкторам реальные, описательные имена. "Create" - это просто соглашение.

5
ответ дан 8 December 2019 в 12:58
поделиться

Проверяли ли вы n-уровневые фреймворки удаленного взаимодействия, уже доступные для Delphi? Я могу вспомнить:

Эти фреймворки находятся на рынке более 5 лет, так что вы получите все неприятные подробности уже решено и протестировано.

Редактировать: к комментарию о ценах:

  • Datasnap включен в версии Delphi Enterprise и Architect. Если у вас есть один из них, он «бесплатный», если у вас есть Delphi professional, он будет стоить вам.
  • kbmMW имеет одну бесплатную версию (проверьте их сайт)
5
ответ дан 8 December 2019 в 12:58
поделиться

Мы используем HitXML (с открытым исходным кодом), который выполняет (де) сериализацию автоматически (с использованием RTTI): http://code.google.com/p/hitxml/

Работает нормально, если вы используете опубликованные методы (RTTI), а также можете использовать свойства «Массив TRTTIEnabled».

1
ответ дан 8 December 2019 в 12:58
поделиться

Я использую SuperObject с Delphi 2010: http://code.google.com/p/superobject/wiki/first_steps и выполните поиск "RTTI & marshalling in Delphi 2010".

Вам следует ознакомиться с проектом «Delphi On Rails»: http://code.google.com/p/delphionrails/ Этот сервер что вам нужно.

1
ответ дан 8 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: