的XmlSerializer忽略编码属性

问题描述:

是否有可能指示.NET的XmlSerializer的XML文档序列化格式如下:的XmlSerializer忽略编码属性

<?xml version="1.0"?> 
<!DOCTYPE root SYSTEM "root.dtd"> 
<root> 
... 
</root> 

即XML声明没有编码属性,文档类型,然后将文档的其余部分?

目前我有:

var bomlessUtf8Encoding = new UTF8Encoding(false); 
var serializer = new XmlSerializer(typeof(T)); 
var namespaces = new XmlSerializerNamespaces(); 
namespaces.Add(string.Empty, string.Empty); 

using (var memoryStream = new MemoryStream()) 
using (var xmlWriter = XmlWriter.Create(memoryStream, new XmlWriterSettings { Indent = false, Encoding = null })) 
{ 
    xmlWriter.WriteDocType(typeof(T).Name, null, ContentSerializer.MlpSvcInit320Dtd, null); 
    serializer.Serialize(xmlWriter, input, namespaces); 

    return bomlessUtf8Encoding.GetString(memoryStream.ToArray()); 
} 

但创建XmlWriterSettings对象因编码被空当.NET乱叫。有没有规范的方法,还是最简单的序列化为一个字符串,然后打电话给.Replace()

不幸的是,第三方供应商要求序列化字符串完全采用这种格式。

XmlTextWriter让您可以删除encoding属性。如果您通过null作为编码,xml将使用UTF-8编码,但encoding属性将被删除。

因此,像这样:

using(var xmlWriter = new XmlTextWriter(memoryStream, null)) 

应该是合适的。您还可以设置Indent等,参考http://msdn.microsoft.com/pl-pl/library/system.xml.xmltextwriter(v=vs.110).aspx

+0

谢谢!它看起来像它的工作(虽然我不得不手动调用'WriteStartDocument()')。有没有办法用'XmlWriter'来做到这一点? “XmlTextWriter”的文档包含注意事项»从.NET Framework 2.0开始,我们建议您使用System.Xml.XmlWriter类。« – knittl 2014-10-20 08:24:20

+0

嘿,我真的不知道。也许这篇博文会帮助:http://www.cookcomputing.com/blog/archives/000577.html,它涉及覆盖一些类,看起来对我来说过分杀伤。 – pmatyszok 2014-10-20 08:46:26

+0

我在单元测试中验证生成的字符串。有时我仍然可以获得编码属性。似乎有某种竞争条件(只有插入,如果我一起执行其他测试)。每次我序列化XML时,我都会创建一个新的'XmlTextWriter'实例。会发生什么? – knittl 2014-10-20 09:22:31