不需要使用中间的MemoryStream
,你可以使用StringWriter
。但是,如果你想将它强制转换为XML格式,你需要使用重写了Encoding
属性的StringWriter
:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
如果您还没有使用C# 6:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
然后:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
显然,您可以将
Utf8StringWriter
变成一个更通用的类,它在构造函数中接受任何编码 - 但根据我的经验,UTF-8是
StringWriter
最常需要的“自定义”编码 :)
现在,正如Jon Hanna所说,这仍然是内部的UTF-16,但是您可能会在某个时候将其传递给其他东西,以将其转换为二进制数据......在
那个点上,您可以使用上面的字符串,将其转换为UTF-8字节,一切都会很好 - 因为XML声明将指定“utf-8”作为编码。
编辑:一个简短而完整的示例,以展示这个工作原理:
using System;
using System.Text;
using System.IO;
using System.Xml.Serialization;
public class Test
{
public int X { get; set; }
static void Main()
{
Test t = new Test();
var serializer = new XmlSerializer(typeof(Test));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, t);
utf8 = writer.ToString();
}
Console.WriteLine(utf8);
}
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
}
结果:
<?xml version="1.0" encoding="utf-8"?>
<Test xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<X>0</X>
</Test>
请注意声明的编码为"utf-8",这正是我们想要的。
utf8EncodedXml
是UTF-16。 - Jon HannaEncoding.Default
,否则你不太可能发送平台相关的编码。如果你能提供更多关于你正在做什么的细节,那会很有帮助——但如果你可以直接流式传输到字节,那肯定会避免在字符串中使用“奇怪”的编码声明所带来的麻烦。 - Jon Skeet