Добавляет ли 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 с спецификацией в качестве получаемого вами представления.

Другие вопросы по тегам