C# XmlSerializer 强制编码类型为 ISO-8859-1

5
我正在尝试将对象序列化并设置编码类型为ISO-8859-1。代码运行时没有抛出任何异常,但返回的编码类型总是设置为"UTF-16"。我已经搜索了许多示例,有100多个示例,但我无法强制所需的编码类型。
我的问题是如何强制将其设置为ISO-8859-1编码?
谢谢您的帮助。
代码如下:
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings
{
    Indent = true,
    OmitXmlDeclaration = false,
    Encoding = Encoding.GetEncoding("ISO-8859-1")
};

using (var stringWriter = new StringWriter())
{
    using (var xmlWriter = XmlWriter.Create(stringWriter, xmlWriterSettings))
    {
        serializer.Serialize(xmlWriter, obj, ns);
    }

    return stringWriter.ToString();
}
1个回答

17

当您将XML写入 TextWriter (例如 StringWriter StreamWriter )时,它始终使用 TextWriter 指定的编码,并忽略 XmlWriterSettings 中指定的编码。 对于 StringWriter ,因为这是.NET字符串在内存中使用的编码,所以编码始终为UTF-16。

解决方法是先写入 MemoryStream ,然后从中读取字符串:

var encoding = Encoding.GetEncoding("ISO-8859-1");
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings
{
    Indent = true,
    OmitXmlDeclaration = false,
    Encoding = encoding
};

using (var stream = new MemoryStream())
{
    using (var xmlWriter = XmlWriter.Create(stream, xmlWriterSettings))
    {
        serializer.Serialize(xmlWriter, obj, ns);
    }
    return encoding.GetString(stream.ToArray());
}

请注意,如果您将XML保存在字符串中并将其写入文件,则需要确保使用相同的编码方式进行写入。


2
@CiaranGallagher请不要编辑答案,只是为了符合您个人的风格偏好。 - Thomas Levesque
正如我在编辑评论中提到的那样,这不是一种风格偏好,而是原始代码导致了Visual Studio代码分析警告。 - Ciaran Gallagher

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