Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Embarcadero RAD Studio XE5-XE8,10.x(Seattle, Berl

Автор: SolidSnakeRU
Дата сообщения: 05.12.2014 11:44
Никто не сталкивался с сериализацией/Десериализацией произвольных объектов в JSON?
У меня был код который это делает, сегодня обнаружил, что в XE6u1 похоже ошибка.
При сериализации, спец символ "\" должен заменяться на "\\", но этого не происходит.

Код: unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Data.DBXJSONReflect, System.JSON;

type

TTest = class
str: string;
end;

tJSONSerializator = class
public
class procedure Serialize(var SerializedData: string; pObj: tObject);
class procedure Deserialize(SerializedData: string; var pObj: Pointer);
end;

TForm1 = class(TForm)
procedure FormCreate(Sender: tObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

class procedure tJSONSerializator.Serialize(var SerializedData: string; pObj: tObject);
var
JSONMarshal: TJSONMarshal;
JSONValue: TJSONValue;
UnformattedJSONString: string;
begin
try
// Инициализация
JSONMarshal := TJSONMarshal.Create(TJSONConverter.Create);
// Сериализация объекта в строку
JSONValue := JSONMarshal.Marshal(pObj);
UnformattedJSONString := JSONValue.ToString;
SerializedData := UnformattedJSONString;
finally
// Выгрузка переменных
if Assigned(JSONValue) then
FreeAndNil(JSONValue);
if Assigned(JSONMarshal) then
FreeAndNil(JSONMarshal);
end;
end;

class procedure tJSONSerializator.Deserialize(SerializedData: string; var pObj: Pointer);
var
JSONUnMarshal: TJSONUnMarshal;
JSONValue: TJSONValue;
begin
try
// Инициализация
JSONUnMarshal := TJSONUnMarshal.Create();
// Десериализация объекта из строки
JSONValue := TJSONObject.ParseJSONValue(SerializedData);
pObj := JSONUnMarshal.Unmarshal(JSONValue);
finally
// Выгрузка переменных
if Assigned(JSONValue) then
FreeAndNil(JSONValue);
if Assigned(JSONUnMarshal) then
FreeAndNil(JSONUnMarshal);
end;
end;

procedure TForm1.FormCreate(Sender: tObject);
var
Test: TTest;
Serialized: string;
begin
Test := TTest.Create;
Test.str := 'C:\Program files (x86)\';
tJSONSerializator.Serialize(Serialized, Test);
if Pos('C:\Program files (x86)\', Serialized) <> 0 then
ShowMessage('Ваш Delphi работает не правильно, "\" должен экранироваться "\\", JSON имеет не корректную структуру.')
else if Pos('C:\\Program files (x86)\\', Serialized) <> 0 then
ShowMessage('Ваш Delphi работает правильно, "\" экранируется "\\".')
else
ShowMessage('Ваш Delphi вернул что-то неожиданное');
end;

end.

Автор: NickNNN
Дата сообщения: 05.12.2014 12:56

Цитата:
Скрин, где на закладках сплошные точки это что-то. Дизай однозначно менять нужно


kaz_av, Создать свою графическую оболочку для Android на базе FMX ? Я уже устал, в JAVA буду это все учитывать (если оно само не учитывается платформой).

Маленький пример по Action bar - в JAVA напихал все что нужно, указал что выводить обязательно, а что нет. На планшетах видно все, на телефоне поскывалось, закладки или на самом баре, или ниже и т.д. Что у нас в делфи? Все ручками...

Точки на скринште это закладки. Неужели сложно было выбранную закладку сделать шире, остальные просто скрыть раз не помещается? Да и еще листание нормально не работает, пришлось две кнопки влево-вправо выводить.

В общем, если долго гондураситься, можно программу более-менее написать.Но она всегда будет проигрывать решениям на JAVA, откуда бы у вас руки не росли


Автор: landy
Дата сообщения: 05.12.2014 13:27

Цитата:
Можете под последним XE7 проверить сериализацию объекта?

Я попытался собрать, однако, непонятно, где описан тип rResult?
Автор: SuPriTo
Дата сообщения: 05.12.2014 15:08
SolidSnakeRU
Скинь файл с проектом для тестирования, чтобы можно было просто проверить.
NickNNN
Эти точки на закладках, это такой эффект FM с закладками. Меня тоже раздражает. Как-то криво у них все это делается.
Автор: SolidSnakeRU
Дата сообщения: 05.12.2014 15:49
SuPriTo, landy
JSON Test


Код выше тоже поправил.
Автор: SuPriTo
Дата сообщения: 05.12.2014 16:07
SolidSnakeRU

Тестил на XE7 без апдейтов.
Автор: SolidSnakeRU
Дата сообщения: 05.12.2014 16:20
Прекрасно, спасибо)
Может кто-нибудь из обладателей подписки запостить на QC?
Автор: kaz_av
Дата сообщения: 05.12.2014 16:26
NickNNN

Цитата:
Создать свою графическую оболочку для Android на базе FMX ? Я уже устал, в JAVA буду это все учитывать (если оно само не учитывается платформой).


Цитата:
Точки на скринште это закладки. Неужели сложно было выбранную закладку сделать шире, остальные просто скрыть раз не помещается?

Понятно, что это табы. Но кто велит использовать табы, раз на мобильных девайсах они не юзабельны при таком количестве? Я к тому, что нужно переделывать организацию работы с данными, разнести как-то по разным экранам, чтоб этой каши из табов небыло. А уж FMX или Java это другой вопрос.
Автор: landy
Дата сообщения: 05.12.2014 16:33
SolidSnakeRU, аналогичное сообщение на XE7 update 1
Автор: NickNNN
Дата сообщения: 05.12.2014 16:48

Цитата:
Я к тому, что нужно переделывать организацию работы с данными, разнести как-то по разным экранам


Количество форм в мобильном приложении ограничено, ибо проблемы с памятью. Писал на QC - получил ответ что на 4.4 работает нормально (действительно работает), а другим системам не повезло. Даже на 4.4 есть проблема при создании большого количества окон начинаются глюки в интерфейсе, но работать продолжает.

Хочется выдумывать свою систему навигации и работы на FMX - пожалуйста. Все равно нативное приложение по удобству всегда будет впереди. Я свою разработку на Делфи мобильных приложений закончил и сделал свои выводы. Писать в QC устал и больше не буду. Для Win32 - Делфи, для Android - JAVA. Для приложений на 2 кнопки и одного списка это не распространяется, серьезное что-то на Делфи сейчас не напишешь, постоянно какие-то грабли
Автор: kaz_av
Дата сообщения: 05.12.2014 17:10
NickNNN

Цитата:
Количество форм в мобильном приложении ограничено, ибо проблемы с памятью.

А если их все одновременно не создавать? Это и на десктопе плохая практика.

з.ы. Вовсе не собираюсь защищать FMX, это неюзабельное говно, но Java волшебным образом не избавит тебя от необходимости редизайна.
Автор: yura371
Дата сообщения: 05.12.2014 19:33

Цитата:
Цитата:
Вопрос как можно обращаться к переменным в базе данных? Я хочу обратиться как к массиву - записать 1-ый элемент из таблицы names в memo1: Memo1.Text:=SQL.table(names).array[1].asString , но так не работает. Дайте совет пожалуйста.
 

  В базе данных не переменные, а таблицы и поля. Плюс, нет такого понятия как номер строки - только идентификатор. Чтобы перебрать все строчки и обратиться к полям тебе нужно сделать цикл наподобие такого:

Код:
   
  Tbl.First;
  while not Tbl.Eof do begin
    Memo1.Lines.Add (Tbl.FieldValues['Name']);
    Tbl.Next;
  end;
 


landy, спасибо. Вы мне очень помогли
Автор: Alexey_Gawrilow
Дата сообщения: 05.12.2014 22:31
SolidSnakeRU

Synopse mORMot
SuperObject

Это библиотеки содержат готовый код для сериализации/десериализации в JSON потомков TPersistent "из коробки".

Но сдается мне, что это просто очередная мода, как 10 лет назад все в XML пихали.

Для человека - JSON, готов согласиться, "легче", чем XML.
НО YAML еще лучше.
Если уж JSON, то в диалекте Mongo - без кавычек в именах. IMHO.

А для машины/программы, если есть редактор настроек/профилей - ВСЕ РАВНО.

Я, храню в родном для Delphi DFM/Text.
Автор: SuPriTo
Дата сообщения: 05.12.2014 23:00

Цитата:
Вовсе не собираюсь защищать FMX, это неюзабельное говно, но Java волшебным образом не избавит тебя от необходимости редизайна.

Табов там слишком много. Все равно нужно переделывать интерфейс.
Автор: SolidSnakeRU
Дата сообщения: 06.12.2014 00:01
Alexey_Gawrilow

DFM тоже ничего, но парсер готовый под него есть только у делфи.
JSON сейчас в тренде) Особенно часто в вебе применяется.
И этот формат мне нравится куда больше чем xml.
YAML посмотрел, что-то не похоже что читать его легче) Может быть дело вкуса.

с Synopse mORMot я так и не познакомился за эти годы.
Был как-то выбор между mORMot и datasnap.
Почитал отзывы и решил пробовать datasnap, все-таки его разрабатывает крупная контора.
ORM тоже интересная штука, интересно насколько она хорошо работает в mORMot.
Хотя, когда всё своё: структура таблиц, классы, алгоритмы работы с данными БД и интерпретация, мне кажется, результат более предсказуемый и поддающийся доработке. FireDac + Datasnap мне выходит ближе.

Насколько я понял, чтобы задействовать сериализацию mORMotа, придется ставить его полностью.
Одним модулем дело не решается. Пока кажется, что поправить баг с экранированием будет проще)
Автор: Alexey_Gawrilow
Дата сообщения: 06.12.2014 08:19
SolidSnakeRU

Цитата:
JSON сейчас в тренде) Особенно часто в вебе применяется.


Цитата:
Но сдается мне, что это просто очередная мода, как 10 лет назад все в XML пихали.



Цитата:
Насколько я понял, чтобы задействовать сериализацию mORMotа, придется ставить его полностью.

на текущий момент 1 модуль SynCrossPlatformJSON.pas




Добавлено:
альтернативная ветка развития внутри проекта.
Специально, чтобы не тащить все остальное.

http://synopse.info/files/html/Synopse%20mORMot%20Framework%20SAD%201.18.html#TITLE_392
http://synopse.info/files/html/api-1.18/SynCrossPlatformJSON.html
http://synopse.info/files/html/api-1.18/SynCrossPlatformJSON.html#OBJECTTOJSON
http://synopse.info/files/html/api-1.18/SynCrossPlatformJSON.html#JSONTOOBJECT
http://synopse.info/files/html/api-1.18/SynCrossPlatformJSON.html#JSONTONEWOBJECT
Автор: NickNNN
Дата сообщения: 06.12.2014 08:53

Цитата:
Цитата:
Количество форм в мобильном приложении ограничено, ибо проблемы с памятью.

А если их все одновременно не создавать? Это и на десктопе плохая практика.


Собственно проблема в TForm.DisposeOf - утечка памяти. В реальном приложении 4-5 раз создать/уничтожить формы и все. Пришлось переделывать логику программы чтобы формы создавались только 1 раз и при повторном открытии инициализация всех данных


Цитата:
Табов там слишком много. Все равно нужно переделывать интерфейс.


На JAVA элементарно меняется вид навигации с табов на выпадающий список при маленьком экране и все. На делфи не забываем про кнопку вперед-назад, так как листание не работает. В итоге выпадающий список табов на тулбар уже не положишь.

Еще раз повторюсь, ели долго гондураситься, можно сделать неплохо. Я уже устал бороться с платформой, сейчас программа отладится по функциональности и приступлю на JAVA. Там уже буду делать по человечески
Автор: SolidSnakeRU
Дата сообщения: 06.12.2014 10:27
Alexey_Gawrilow

Цитата:
на текущий момент 1 модуль SynCrossPlatformJSON.pas
Спасибо)
Автор: Medium
Дата сообщения: 06.12.2014 16:09
landy

Цитата:
Medium, спасибо, выглядит симпатично. А какими способами он может принимать данные от внешней программы?

Варианты там могут быть разные, я использовал JSON. Тут главный, наверное, недостаток - необходимость сохранения файлов (*.js, *.css + *.html) на диск (обычно во временной папке) и уже их последующая загрузка. Но если всё сделать аккуратно - работает отлично и, что важно, очень быстро.
Автор: SuPriTo
Дата сообщения: 08.12.2014 12:21

Цитата:
На делфи не забываем про кнопку вперед-назад, так как листание не работает.

Сейчас специально проверил. У меня работает листание табов. Правда с глюками небольшими. Но работает вполне сносно.
Автор: NickNNN
Дата сообщения: 08.12.2014 12:39

Цитата:
Сейчас специально проверил. У меня работает листание табов. Правда с глюками небольшими. Но работает вполне сносно.


Сносно для демо приложения. А для реального это не годится. Листание то срабатывает со второго раза, то вообще перестает работать. То быстро нужно листать, то медленно и т.д.

Достаточно установить стандартный пример с Android Studio чтобы, как говориться, почувствовать разницу
Автор: X11
Дата сообщения: 11.12.2014 10:50
http://otapi.com/2014/12/04/plugin-spotlight-monkeymixer-vcl-and-fmx-in-the-same-project/
VCL и FM в одном проекте. И даже на одной форме.
Автор: Eternal_Shield
Дата сообщения: 11.12.2014 14:50

Цитата:
VCL и FM в одном проекте. И даже на одной форме.

Занимательно, но "какой навар с этого босяка?" (с)
Автор: landy
Дата сообщения: 11.12.2014 20:41

Цитата:
"какой навар с этого босяка?"

идея в том, что большой проект можно портировать с одного фреймворка на другой постепенно, форму за формой, имея каждый раз хоть как-то работоспособную версию.
Автор: SolidSnakeRU
Дата сообщения: 12.12.2014 18:40

Цитата:
Вообще, есть большое желание забыть про INI файлы и настройки тоже хранить в JSON.
Если использовать код из коробки, то не хватает:
1. Нормального сохранения без ошибок (ну допустим это можно исправить).
2. Нормального форматирования - отступы, переносы и т.д.
3. Возможность задать исключения, чтобы некоторые свойства объектов не сохранялись и не загружались.

Оказалось есть исключения, чтобы при формировании json исключить часть полей надо скрыть RTTI информацию, например так:

Код:
{$RTTI EXPLICIT FIELDS([vcPrivate, vcPublic])}
TRestRolesUsers = class
protected
FMultiReadExclusiveWriteSynchronizer: TMultiReadExclusiveWriteSynchronizer;
private
FRoles: TRestRoleArray;
function FRolesRead(): TRestRoleArray;
public
constructor Create();
destructor Destroy(); override;
property Roles: TRestRoleArray read FRolesRead;
procedure SetRolesLength(l: integer);
end;
Автор: protoror
Дата сообщения: 15.12.2014 13:01
Medium
Буду признателен, если расcкажете подробнее как в delphi использовать jquery.
или это просто вывод через tchomium?
Автор: Medium
Дата сообщения: 16.12.2014 12:14
protoror
У меня было всё просто, на самом деле. Обычная загрузка файла с локального компьютера через TWebBrowser. Да, отсутствует универсальность и есть зависимость от IE и его версии (хотя тестировалось на всех, начиная с IE6 - никаких проблем).
Но для моей задачи это не критично и у пользователей работает как часы, проверено.
Автор: protoror
Дата сообщения: 16.12.2014 13:08
Medium
ясно в своем проекте инфомата использую chromium, что и вам советую)
Автор: Alexey_Gawrilow
Дата сообщения: 16.12.2014 18:20
SolidSnakeRU

Цитата:
Столкнулся с проблемой авторизации, когда в логине или пароле русские символы. Раскопал до Datasnap.DSHTTPWebBroker.


Вопрос можно?
А транспорт на чем?
Просто DataSnap раньше на инфраструктуре WtbBroker'а жил.
А там транспортный уровень на сервере реализует Indy.

Отлично работает HTTP/Basic

Код:
type
TIdHTTPAppRequestFriend = class(TIdHTTPAppRequest);

function TwmMain.AuthGet(Request: TWebRequest): Boolean;
var
s: string;
i: Integer;
begin
Result := False;
Assert(Assigned(Request), '{99B95341-818E-4BD1-AFB3-DD7FB41F9017}');

fAuth := ''; fUsr := ''; fPsw := '';

s := Request.Authorization;
if s > '' then begin
i := Pos(' ', s);
if i > 0 then
fAuth := cAuthHTTP + Copy(s, 1, i-1);
if Request is TIdHTTPAppRequest then begin
fUsr := TIdHTTPAppRequestFriend(Request).FRequestInfo.AuthUsername;
fPsw := TIdHTTPAppRequestFriend(Request).FRequestInfo.AuthPassword;
end;

Result := (fAuth > '') and (fUsr > '') and (fPsw > '');
end;
end;
Автор: V1s1ter
Дата сообщения: 17.12.2014 13:19
Для знающих
Други, как подружить GLScene и Делфи XE7? Компилится, пакеты ставятся, но при создании нового проекта с GLScene Делфи просто моргнув окном вылетает.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129

Предыдущая тема: Отмена встречи в Outlook из Excel VBA


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.