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

3

我将一个C#对象序列化为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文档在第一行显示如下内容:
<?xml version="1.0" encoding="UTF-16"?>

我尝试将XmlTextWriter中的编码从Encoding.Unicode更改为Encoding.UTF8,但这不会更改XML文档的第一行,它仍然显示UTF-16。
我还尝试使用带有4个参数(writer,object,namespaces,encoding)的Serialize方法签名,并指定UTF8作为编码,但也没有更改XML文档规范。
我相信我只需要更改XML文档中显示的编码为UTF-8,第三方供应商就会满意。我无法弄清楚我做错了什么。
1个回答

3
如果我从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);
}

我会再试一次并仔细检查。 - GJGerson
我将编码更改为UTF8后再次运行代码,但仍然输出带有UTF-16规范的XML文档。我将更改代码以使用using而不是close。 - GJGerson
2
好吧,我是个白痴。我在两个地方(事件)都这样做了,我在一个地方进行更改并从另一个事件测试它。它有效。将XmlWriter中的编码更改为UTF8即可解决问题。 - GJGerson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接