Добавляет ли SQL Server метку порядка байтов при приведении к XML? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть этот метод 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 саму спецификацию при приведении? И это так, есть ли способ предотвратить это?

EDIT:

Я получаю значение из очереди с помощью этого запроса в тесте соответствия:

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 Ответ

0 голосов
/ 20 ноября 2018

Технически я не думаю, что он добавляет спецификацию при приведении в формате XML , поскольку :

Данные хранятся во внутреннем представлении, которое сохраняет содержимое XMLданные.Это внутреннее представление включает в себя информацию об иерархии содержимого, порядке документа, а также значениях элементов и атрибутов.В частности, содержимое InfoSet данных XML сохраняется

Поскольку спецификация представляет собой артефакт кодировок строк XML и не является частью XML Infoset, я не думаю, чтоBOM сохраняется.

Однако , если вы преобразуете данные XML в двоичное или строковое представление в SQL Server, похоже, вы предпочитаете кодировку UTF-16 с BOM в качестве представления, которое выполучать.

...