转换为XML时,SQL Server是否添加字节顺序标记?

时间:2018-11-20 08:59:55

标签: c# sql-server byte-order-mark

我有这个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

此存储过程将其作为消息添加到服务代理队列中。

但是,在测试时,从队列中检索BOM仍然存在。

SQL Server是否在投射时添加BOM表本身?因此,有没有办法防止这种情况发生?

编辑:

我在fitnesse测试中使用以下查询从队列中检索值:

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();

我知道BOM仍然存在,因为测试需要通过它:

   if (castedMessageBody.StartsWith(_byteOrderMarkUtf8, StringComparison.Ordinal))
   {
       castedMessageBody = castedMessageBody.Remove(0, _byteOrderMarkUtf8.Length);
   }

1 个答案:

答案 0 :(得分:3)

从技术上讲,我不认为在将其转换为XML since时确实会添加BOM:

  

数据以内部表示形式存储,该内部表示形式保留数据的XML内容。此内部表示包括有关包含层次结构,文档顺序以及元素和属性值的信息。具体来说,将保留XML数据的InfoSet内容

由于BOM是XML的字符串编码的产物,而不是XML Infoset的一部分,因此我认为不存储BOM。

但是,如果在SQL Server中将XML数据转换为二进制或字符串表示形式,则似乎更喜欢使用BOM作为接收的BOM表的UTF-16编码。