如何在C#中序列化对象时指定XML编码

时间:2014-06-07 13:49:00

标签: c# xml encoding utf-8

我将C#对象序列化为XML文档,并将XML文档发送给第三方供应商。供应商告诉我文档中的编码规范是UTF-16,但XML文档包含UTF-8内容,他们无法使用它。以下是我用来创建XML文件的代码,该文件无错误地运行并创建XML文档。

// Instantiate xmlSerializer with my object type.
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyObject));

// Instantiate a new stream and pass file location and mode.
Stream stream = new FileStream(@"C:\doc.xml", FileMode.Create);

// Instantiate xmlWriter and pass stream and encoding.
XmlWriter xmlWriter = new XmlTextWriter(stream, Encoding.Unicode);

// Call serialize method and pass xmlWriter and my object.
xmlSerializer.Serialize(xmlWriter, myObject);

// Close writer and stream.
xmlWriter.Close();
stream.Close();

当我运行时,XML Doc会在第一行显示:

<?xml version="1.0" encoding="UTF-16"?>

我尝试在XmlTextWriter中将Encoding从Encoding.Unicode更改为Encoding.UTF8,但这并没有改变XML Doc的第一行,它仍然显示UTF-16。

我还尝试使用Serialize方法签名,该签名采用4个参数(编写器,对象,命名空间,编码)和指定的UTF8作为编码,并且也没有更改XML Doc规范。

我相信我需要做的就是将XML Doc中显示的编码更改为UTF-8,第三方供应商会很高兴。我无法弄清楚我做错了什么。

1 个答案:

答案 0 :(得分:2)

如果我从Encoding.Unicode更改为Encoding.UTF8,则会正确生成文件。也许您正在查看旧版本的文件?

在一个不相关的位中,您应该使用using来确定性地处理实现IDisposable的对象:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyObject));

using (Stream stream = new FileStream(@".\doc.xml", FileMode.Create))
using (XmlWriter xmlWriter = new XmlTextWriter(stream, Encoding.UTF8))
{
    xmlSerializer.Serialize(xmlWriter, myObject);
}