SolidSnakeRU
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Никто не сталкивался с сериализацией/Десериализацией произвольных объектов в 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. | Можете под последним XE7 проверить сериализацию объекта? Добавлено: Вообще, есть большое желание забыть про INI файлы и настройки тоже хранить в JSON. Если использовать код из коробки, то не хватает: 1. Нормального сохранения без ошибок (ну допустим это можно исправить). 2. Нормального форматирования - отступы, переносы и т.д. 3. Возможность задать исключения, чтобы некоторые свойства объектов не сохранялись и не загружались. Поправьте если я ошибаюсь. Это достижимо только в такой реализации: Свой код, используя обход свойств заданного объекта с известным классом на основе данных RTTI и полученного списка исключений формировать TSuperObject (имеет функцию сохранения JSON с отступами) и сохранять в строку / файл. Тоже самое для загрузки. Это получается много писать то.. | Всего записей: 248 | Зарегистр. 27-08-2008 | Отправлено: 12:44 05-12-2014 | Исправлено: SolidSnakeRU, 16:54 05-12-2014 |
|