为了简洁,删除了适当的对象处理,但如果这是在内存中将对象编码为UTF-8的最简单方法,我会感到震惊。一定有更简单的方法,不是吗?
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream, System.Text.Encoding.UTF8);
serializer.Serialize(streamWriter, entry);
memoryStream.Seek(0, SeekOrigin.Begin);
var streamReader = new StreamReader(memoryStream, System.Text.Encoding.UTF8);
var utf8EncodedXml = streamReader.ReadToEnd();
发布于 2010-10-05 17:05:28
当您再次将UTF-8读回字符串时,您的代码不会将UTF-8放入内存,因此它不再是UTF-8格式,而是回到了UTF-16格式(尽管理想情况下,最好在比任何编码级别更高的级别上考虑字符串,除非被迫这样做)。
要获得实际的UTF-8八位字节,您可以使用:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream, System.Text.Encoding.UTF8);
serializer.Serialize(streamWriter, entry);
byte[] utf8EncodedXml = memoryStream.ToArray();
我遗漏了和你一样的处理方法。我稍微倾向于以下几点(剩下的正常处理):
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
using(var memStm = new MemoryStream())
using(var xw = XmlWriter.Create(memStm))
{
serializer.Serialize(xw, entry);
var utf8 = memStm.ToArray();
}
这几乎是相同的复杂度,但确实表明在每个阶段都有一个合理的选择来做其他事情,其中最紧迫的是序列化到内存以外的其他地方,例如序列化到文件、TCP/IP流、数据库等。总而言之,它并没有那么冗长。
发布于 2013-01-31 02:20:56
使用继承的答案非常好,只需记住覆盖初始值设定项
public class Utf8StringWriter : StringWriter
{
public Utf8StringWriter(StringBuilder sb) : base (sb)
{
}
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
https://stackoverflow.com/questions/3862063
复制相似问题