Добавляет ли SQL Server метку порядка байтов при приведении к XML?
У меня есть этот метод C#, который предназначен для игнорирования метки порядка байтов при сериализации в XML:
public static string SerializeAsXml(this object dataToSerialize)
{
if (dataToSerialize == null) return null;
using (var stringwriter = new StringWriter())
{
var serializer = new XmlSerializer(dataToSerialize.GetType());
serializer.Serialize(stringwriter, dataToSerialize);
var xml = stringwriter.ToString();
var utf8 = new UTF8Encoding(false);
var bytes = utf8.GetBytes(xml);
xml = utf8.GetString(bytes);
return xml;
}
}
Результат передается в хранимую процедуру и приводится к XML следующим образом: @EventMessage AS XML
Эта хранимая процедура добавляет это как сообщение в очередь компонента Service Broker.
Но при тестировании спецификация все еще присутствует при извлечении из очереди.
Добавляет ли SQL Server саму спецификацию при приведении? И это так, есть ли способ предотвратить это?
РЕДАКТИРОВАТЬ:
Я получаю значение из очереди с помощью этого запроса в тесте пригодности:
var sqlSelectCommand =
$@"SELECT message_type_name, message_body, casted_message_body =
CASE message_type_name WHEN 'X'
THEN CAST(message_body AS NVARCHAR(MAX))
ELSE message_body
END
FROM {QueueName} WITH (NOLOCK)";
Это читается с этим:
var castedMessageBody = reader["casted_message_body"].ToString();
И я знаю, что спецификация все еще присутствует, потому что тест должен пройти это:
if (castedMessageBody.StartsWith(_byteOrderMarkUtf8, StringComparison.Ordinal))
{
castedMessageBody = castedMessageBody.Remove(0, _byteOrderMarkUtf8.Length);
}
1 ответ
Технически я не думаю, что он добавляет спецификацию при приведении в XML, так как:
Данные хранятся во внутреннем представлении, которое сохраняет XML-содержимое данных. Это внутреннее представление включает информацию об иерархии содержимого, порядке документа, а также значениях элементов и атрибутов. В частности, содержимое InfoSet данных XML сохраняется
Поскольку спецификация является артефактом строкового кодирования XML, а не частью информационного набора XML, я не думаю, что спецификация хранится.
Тем не менее, если вы преобразуете данные XML в двоичное или строковое представление в SQL Server, похоже, вы предпочтете кодировку UTF-16 с спецификацией в качестве получаемого вами представления.