AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.10.2010, 16:34   #1  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Сериализация common в xml Container+BLOB
Для воспроизведения проблемы создать таблицу TableCon и контейнерные поля ConField1,ConField2,ConField3.
Запустить джоб
X++:
static void TableCon(Args _args)
{
    TableCon                TableCon1,TableCon2;
    xml                     xml1;
    xmlDocument             xmlDocument = new xmlDocument();
    XMLNode                 xmlNode;
    Query                   Query   = new Query();
    #localMacro.checkConFileds
    if(TableCon1.ConField%1 != TableCon2.ConField%1)
        error("ConField%1. Не равны");
    else
        info ("ConField%1. Равны");
    #endMacro
    ;
    Query.addDataSource(tableNum(inventTable)).addRange(fieldNum(inventTable,itemId));
    TableCon1.clear();
    TableCon1.ConField1         = Query.pack();
    TableCon1.ConField2         = [Query.pack()];
    TableCon1.ConField3         = [Query.pack(),"123",123,["gggg",Query.pack()]];
    xml1                        = TableCon1.xml();
    xmlDocument.loadXml(xml1);
    TableCon2                   = Global::recordFromXMLNode(xmlDocument.documentElement(),TableCon2);
    #checkConFileds(1)
    #checkConFileds(2)
    #checkConFileds(3)
}
Ошибка возникает в случае, если контейнер с данными BLOB не является сам элементом контейнера.
Вносим изменения в методы класса Global
X++:
// The node is <container> ... </container>
static container containerFromXMLNode(XmlNode n)
{
...
            case 'blob':
                containerToInsert = BinData::stringToData(getXmlNodeValue(element));
//                retval = conins(retval, elemNo, containerToInsert);
                retval = containerToInsert;
                break;
...
}
X++:
// Returns a XML string describing the given value of the given type.
static str xMLString(anytype value, Types theType, int indent=0)
{
...
//                contents = conpeek(c, i);
//                if (conlen(contents) == 1 && typeof(conpeek(contents, 1)) == Types::BLOB)
//                {
//                    result += strrep(' ', _indent+4) + '<element type=\"' + typeToString(Types::BLOB) + '\">';
//                    result += BinData::dataToString(contents);
//                    result += '</element>\n';
//                }
//                else
//                {
                    result += strrep(' ', _indent+4) + '<element type=\"' + typeToString(t) + '\">\n';
                    result += Global::xMLString(conpeek(c, i), t, indent+4+4);
                    result += strrep(' ', _indent+4);
                    result += '</element>\n';
//                }
...
}
Джоб отрабатывает без ошибок.
Вопросы
1. Почему код метода Global::xMLString(anytype value, Types theType, int indent=0) написан именно так и принудительно изменяется структура контейнера с данными типа BLOB?
2. Является ли оригинальный код ошибкой?
3. Будет ли ошибкой скорректировать код и получить возможность сериализовать BLOB полностью?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Сериализация common в xml axbegin DAX: Программирование 15 13.08.2009 09:43
X++: Serializing Axapta Foundation Class instances as XML streams Blog bot DAX Blogs 0 04.06.2009 23:05
PatrickChua: XML serialization Blog bot DAX Blogs 0 04.05.2009 14:05
axStart: How to use XSLT in AIF and what’s wrong with empty xml Nodes. Blog bot DAX Blogs 0 27.04.2008 18:07
axaptapedia: Container Blog bot DAX Blogs 0 06.03.2007 00:33

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:18.