Для воспроизведения проблемы создать таблицу 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 полностью?