使用XmlWriterSettings和XmlSerializer编写XML片段会产生额外的字符

我需要编写一个XML片段供Web服务使用。 任何xml声明都会导致Web服务拒绝该请求。 为了支持这一点,我有以下课程:

public class ContentQueryCriteria { public int Type { get; set; } public string Value { get; set; } public int Condition { get; set; } } 

这允许我设置请求标准,然后得到结果。

代码使用如下:

 ContentQueryCriteria content = new ContentQueryCriteria(); content.Type = 1; content.Value = "NAVS500"; content.Condition = 1; string requestBody = SerializeToString(content); Console.WriteLine(requestBody); 

当我将其序列化为XML文件时,我得到了正确的响应,没有XML声明或任何名称空间。 但是,我宁愿捕获内存流中的数据,而不是文件。

使用以下方法(取自http://www.codeproject.com/Articles/58287/XML-Serialization-Tips-Tricks )我能够取得成果,但出于某种原因,我有一个? 列为字符串的一部分。

 public static string SerializeToString(object obj) { XmlSerializer serializer = new XmlSerializer(obj.GetType()); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); MemoryStream ms = new MemoryStream(); XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; settings.Encoding = Encoding.Unicode; XmlWriter writer = XmlWriter.Create(ms, settings); serializer.Serialize(writer, obj, ns); return Encoding.Unicode.GetString(ms.ToArray()); } 

结果字符串是:

 ?1NAVS5001 

如果我设置OmitXmlDeclaration = false我得到以下字符串:

 ?1NAVS5001 

任何人都可以帮我确定额外的原因吗? 在那里,我怎么能删除它?

使用没有BOM的SerializeToString方法

 public static string SerializeToString(object obj) { XmlSerializer serializer = new XmlSerializer(obj.GetType()); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); MemoryStream ms = new MemoryStream(); XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; settings.Encoding = new UnicodeEncoding(bigEndian: false, byteOrderMark: false); XmlWriter writer = XmlWriter.Create(ms, settings); serializer.Serialize(writer, obj, ns); return Encoding.Unicode.GetString(ms.ToArray()); } 

您将BOM(字节顺序掩码)视为从流的字节数组转换的字符串中的第一个字符。

关闭输出BOM,你会没事的。

使用不生成BOM的编码对象: UnicodeEncoding

 settings.Encoding = new UnicodeEncoding(bigEndian:false,byteOrderMark:true)