如何将对象序列化为UTF-8编码的XML字符串?
解决XML序列化生成UTF-8编码的问题
我明白你遇到的困扰——默认的StringWriter会强制输出UTF-16的编码声明,这是因为它的Encoding属性被硬编码为UTF-16,而且默认情况下无法直接修改。下面给你两个可靠的解决方案,帮你生成带有UTF-8编码声明的XML:
方案1:自定义UTF-8版的StringWriter
最简单的方式是创建一个StringWriter的子类,重写它的Encoding属性为UTF-8,这样XmlSerializer就会自动生成正确的编码声明:
// 自定义StringWriter子类,指定UTF-8编码 public class Utf8StringWriter : StringWriter { public override Encoding Encoding => Encoding.UTF8; } // 修改后的序列化方法 public static string SerializeObject<T>(this T toSerialize) { XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType()); using (StringWriter textWriter = new Utf8StringWriter()) { xmlSerializer.Serialize(textWriter, toSerialize); return textWriter.ToString(); } }
这个方法的好处是改动最小,几乎和你原来的代码结构一致,只是替换了StringWriter的实现。
方案2:使用MemoryStream + StreamWriter直接控制编码
如果你更倾向于直接控制流的编码,可以用MemoryStream配合StreamWriter来实现,这样能更直观地指定UTF-8编码:
public static string SerializeObject<T>(this T toSerialize) { XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType()); using (MemoryStream ms = new MemoryStream()) // 明确指定UTF-8编码创建StreamWriter using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8)) { xmlSerializer.Serialize(sw, toSerialize); // 将流指针重置到开头,准备读取内容 ms.Position = 0; using (StreamReader sr = new StreamReader(ms)) { return sr.ReadToEnd(); } } }
这个方法通过直接写入UTF-8编码的流,确保生成的XML首行会包含<?xml version="1.0" encoding="utf-8"?>的声明。
额外提示
如果你的场景不需要XML声明,可以在序列化时传入XmlWriterSettings并设置OmitXmlDeclaration = true,但这应该不是你当前的需求。
内容的提问来源于stack exchange,提问作者Piero Alberto
相关产品推荐
相关产品推荐

