Delphi: транспортировка объектов на удаленные компьютеры - PullRequest
6 голосов
/ 09 марта 2010

Hallo.

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

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

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

Итак, я создал оба

TBest.toString: string;

и

TBest.fromString(source: string): TBest;

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

Вопрос: Есть ли лучший и более элегантный способ сделать это? Сериализация - это ключевое слово, да, но разве это не ужасно / сложно, когда вы сериализуете объект (в данном случае TBestellung), который содержит массив других объектов (в данном случае TBest)? // Небольшая поправка: Прежде чем его спросят. Да, я должен создать дополнительный (статический) класс для toString и fromString, потому что в противном случае серверу необходимо создать «пустой» TBest, чтобы иметь возможность использовать fromString.

Ответы [ 6 ]

6 голосов
/ 09 марта 2010

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

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

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

5 голосов
/ 09 марта 2010

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

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

Изменить: на комментарий о ценах:

  • Datasnap включен в версии Delphi для предприятий и архитекторов. Если у вас есть один из них, то это «бесплатно», если у вас есть профессиональный Delphi, то это будет стоить вам.
  • kbmMW имеет одну бесплатную версию (проверьте их сайт)
5 голосов
/ 09 марта 2010

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

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

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

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

Я использую SuperObject с Delphi 2010: http://code.google.com/p/superobject/wiki/first_steps и поиск "RTTI и сортировка в Delphi 2010".

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

1 голос
/ 09 марта 2010

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

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

0 голосов
/ 09 марта 2010

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

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

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

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

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

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