You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将对象序列化为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:14:06