为什么XmlWriter总是输出utf-16编码?

Gle*_*ven 26 c# xmlwriter xml-serialization

我有这种扩展方法

    public static string SerializeObject<T>(this T value)
    {
        var serializer = new XmlSerializer(typeof(T));           
        var settings = new XmlWriterSettings
                       {
                        Encoding = new UTF8Encoding(true), 
                        Indent = false, 
                        OmitXmlDeclaration = false,
                        NewLineHandling = NewLineHandling.None
                       };

        using(var stringWriter = new StringWriter()) 
        {
            using(var xmlWriter = XmlWriter.Create(stringWriter, settings)) 
            {
                serializer.Serialize(xmlWriter, value);
            }

            return stringWriter.ToString();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但每当我调用它时,它都有一个utf-16指定的编码,即<?xml version="1.0" encoding="utf-16"?>.我究竟做错了什么?

Joh*_*ers 16

字符串是UTF-16,因此写入StringWriter将始终使用UTF-16.如果那不是你想要的,那么使用你想要TextWriter的编码来使用其他派生类.

  • 摇头.那么在XmlWriterSettings上有一个编码属性的重点是什么.是的,字符串是UTF-16,但是如果我们要序列化为字符串,那么因为我们要写一个文件或其他东西,我们希望xml声明的编码属性与我们文件的实际编码相匹配创建,这不太可能是UTF-16. (3认同)

Boj*_* Li 15

据我所知,StringWriter类在序列化为字符串时将始终使用UTF 16编码.您可以编写自己的覆盖类,接受不同的编码:

public class StringWriterWithEncoding : StringWriter
{
    private readonly Encoding _encoding;

    public StringWriterWithEncoding()
    {
    }

    public StringWriterWithEncoding(IFormatProvider formatProvider)
        : base(formatProvider)
    {
    }

    public StringWriterWithEncoding(StringBuilder sb)
        : base(sb)
    {
    }

    public StringWriterWithEncoding(StringBuilder sb, IFormatProvider formatProvider)
        : base(sb, formatProvider)
    {
    }


    public StringWriterWithEncoding(Encoding encoding)
    {
        _encoding = encoding;
    }

    public StringWriterWithEncoding(IFormatProvider formatProvider, Encoding encoding)
        : base(formatProvider)
    {
        _encoding = encoding;
    }

    public StringWriterWithEncoding(StringBuilder sb, Encoding encoding)
        : base(sb)
    {
        _encoding = encoding;
    }

    public StringWriterWithEncoding(StringBuilder sb, IFormatProvider formatProvider, Encoding encoding)
        : base(sb, formatProvider)
    {
        _encoding = encoding;
    }

    public override Encoding Encoding
    {
        get { return (null == _encoding) ? base.Encoding : _encoding; }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你可以用它代替:

using(var stringWriter = new StringWriterWithEncoding( Encoding.UTF8))
{
   ...
}
Run Code Online (Sandbox Code Playgroud)