21.10.2010, 16:34 | #1 |
Участник
|
Сериализация 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) } Вносим изменения в методы класса 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 полностью? |
|