06.04.2010, 15:24 | #1 |
Участник
|
Container, bin data, Binary, base64
Добрый день..
Надо контейнер перенести через ХМЛ. Поэтому встаёт вопрос, как перекодировать контейнер. ХМЛ полюбому будет просить определённый формат (без спец символов). Пока удалось строку закодировать в base64, но вот как контейнер переделать в нормальную строку или Binary/Base64 незнаю. Контейнер у меня очень сложный - вложенные контейнеры. поэтому я больше предпочёл бы Binary. BinData и Binary между собой несовместымы. к тому же функция setData() в Ахапте вообще глухая - даже инфолог после неё не работает (если в Job-e запускаю) Подскажите где копать? |
|
06.04.2010, 16:28 | #2 |
MCTS
|
Может быть функция con2str() класса Global Вам поможет? Только для вложенных контейнеров ее надо будет дописать...
|
|
06.04.2010, 16:52 | #3 |
Участник
|
Я написал рекурсивную функцию. Только вот теперь лень писать рекурсивную "str2con" .
В контейнерах могут также быть и любые другие данные. Пока остановился на этом очень не красивом варианте X++: public client static Binary con2Binary(container _c) { BinData bd = new BinData(); Binary b; int i; int num; Array SafeArray; ; // setData - does not work new BinaryIo('a','w').writeExp(_c); bd.loadFile('a'); SafeArray = bd.getVariant().safeArray(); num = SafeArray.lastIndex(); b = new Binary(num+1); for(i=1; i<(num+1); i++) b.byte(i-1, SafeArray.value(i)); return b; } |
|
08.04.2010, 10:40 | #4 |
Участник
|
Может, имеет смысл посмотреть метод global::XMLString().
|
|
|
За это сообщение автора поблагодарили: Poleax (1). |
08.04.2010, 11:45 | #5 |
Участник
|
Да, функция XMLString возвращает то что надо, но вот подумал. это же огромный ХМЛ код...
У меня будет >200.000 записей с таким контейнером. Проблема в таком случае, что Ахапта не умеет загружать такой большой ХМЛ фаил (>400Мб), если работаем с ДОМ-ХМЛ (встроенные классы Ахапта XMLDocument и подобные) Вторая проблема - в контейнере иногда хранится бинарные данные (картинка и т.д.) Сейчас я остановился на том, что из ХМЛ получаю нормальный Base64 (если смотреть через дебагер по байтам). Но вот нет ни одной ф-ии, которая могла бы загрузить обратно в контейнер (для этого мне надо бинарнэ данные загрузить в файл и тогда читать с помощью BinData + read() + getData()) |
|
08.04.2010, 12:25 | #6 |
Участник
|
Можно сделать так
X++: { ContainerClass cs; container c = [1, ["sdklf", "лывоадфа", 01\12\2009], 2.3, "klsdffa"]; container c1; str s; ; cs = new ContainerClass(c); s = BinData::dataToString(cs.toBlob()); info (s); c1 = ContainerClass::blob2Container( BinData::stringToData(s) ); conview(c); conview(c1); }
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: mazzy (2), Logger (6), perestoronin (1), Delfins (2), gl00mie (2). |
08.04.2010, 12:33 | #7 |
Участник
|
Вот спасибо.. теперь только проверить, как будет работать [Ах3 -> Ах5]
Последний раз редактировалось Delfins; 08.04.2010 в 13:13. |
|
08.04.2010, 12:45 | #8 |
Участник
|
Этот код я в DAX2009 писал
__________________
Axapta v.3.0 sp5 kr2 |
|
08.04.2010, 12:46 | #9 |
Участник
|
Или вы хотите передавать из Ax3 в DAX2009?
__________________
Axapta v.3.0 sp5 kr2 |
|
08.04.2010, 13:13 | #10 |
Участник
|
Всё отлично работает! Мега-респект.. долго мучался с вариациями встроенных функций.
PS: надо с любой версии в любую (3->4, 3->5, 5->4, 5->5) |
|
08.04.2010, 13:21 | #11 |
Участник
|
Из тройки в более старшие версии так не получится передавать
Внутренний формат контейнера, в связи с переходом на юникод, был переработан начиная с четверки. По-этому, попытка загрузить из внутреннего представления тройки может привести к различным глюкам, вплоть до падения клиента.
__________________
Axapta v.3.0 sp5 kr2 |
|
08.04.2010, 13:26 | #12 |
Участник
|
Это ты думал если передавать как бинарник через BASE64
Или через предложенный вариант!? У меня получилость из 3-ки в 5-ку по твоему методу. Или он не будет работать, если будут уникод данные? X++: ContainerClass::blob2Container( BinData::stringToData(s) ); |
|
08.04.2010, 13:45 | #13 |
Участник
|
Со строками будет засада.
Первое вхождение строки в контейнер восстановится, а вот то, что дальше - с большой вероятностью нет
__________________
Axapta v.3.0 sp5 kr2 |
|
08.04.2010, 19:42 | #14 |
Участник
|
Да, проверил.
Через RemoteDesktop на сервере фигня заимпортировалась. А вот на Виндовз-7 нормально.. походу дела, надо как-то заставить это всё дело работать в уникоде (и в Ах3 и в Ах5 на сервере) |
|