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
答案 0 :(得分:3)
StringWriter
的{{1}}属性实际上并没有那么有用,因为它写的基础是Encoding
,它产生.Net StringBuilder
。 .Net字符串在utf16内部编码,但这是一个你不必担心的实现细节。 string
只是继承自Encoding
的属性,因为TextWriter
可能会写入编码重要的目标(TextWriter
,Stream
,...)
最后,你将得到一个普通的byte[]
。您稍后将用于序列化该字符串的编码尚未修复,如果您使用的是以字符串作为参数的MongoDb客户端实现,那么您甚至不关心它!
另一方面,覆盖string
属性的getter不会改变编码在内部发生的方式,即使编码实际涉及Encoding