在序列化期间我应该担心编码吗?

时间:2016-03-11 09:56:01

标签: c#

public string Serialize(BackgroundJobInfo info)
{
    var stringBuilder = new StringBuilder();
    using (var stringWriter = new StringWriter(stringBuilder, CultureInfo.InvariantCulture))
    {
        var writer = XmlWriter.Create(stringWriter);
        ...

默认情况下,StringWriter会将自己宣传为UTF-16。通常XML位于UTF-8。 所以我可以通过继承StringWriter

来解决这个问题
public class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding
    {
         get { return Encoding.UTF8; }
    }
}

但我为什么要担心呢?如果我决定使用StringWriter(就像我做的那样)而不是Utf8StringWriter,将会怎样?我会有一些错误吗?

之后我会将此字符串写入MongoDb

1 个答案:

答案 0 :(得分:3)

StringWriter的{​​{1}}属性实际上并没有那么有用,因为它写的基础是Encoding,它产生.Net StringBuilder。 .Net字符串在utf16内部编码,但这是一个你不必担心的实现细节。 string只是继承自Encoding的属性,因为TextWriter可能会写入编码重要的目标(TextWriterStream,...)

最后,你将得到一个普通的byte[]。您稍后将用于序列化该字符串的编码尚未修复,如果您使用的是以字符串作为参数的MongoDb客户端实现,那么您甚至不关心它!

另一方面,覆盖string属性的getter不会改变编码在内部发生的方式,即使编码实际涉及Encoding