我有这个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);
}
答案 0 :(得分:3)
从技术上讲,我不认为在将其转换为XML since时确实会添加BOM:
数据以内部表示形式存储,该内部表示形式保留数据的XML内容。此内部表示包括有关包含层次结构,文档顺序以及元素和属性值的信息。具体来说,将保留XML数据的InfoSet内容
由于BOM是XML的字符串编码的产物,而不是XML Infoset的一部分,因此我认为不存储BOM。
但是,如果在SQL Server中将XML数据转换为二进制或字符串表示形式,则似乎更喜欢使用BOM作为接收的BOM表的UTF-16编码。