我有这个扩展方法
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();
}
}
但是每当我调用它的时候,它都有一个指定的utf-16
编码,即<?xml version="1.0" encoding="utf-16"?>
。我做错了什么?
发布于 2012-02-27 10:25:40
字符串采用UTF-16格式,因此写入StringWriter时将始终使用UTF-16格式。如果这不是您想要的,那么使用其他TextWriter
派生类,并使用您喜欢的编码。
发布于 2012-02-27 10:03:50
据我所知,当序列化为字符串时,StringWriter类总是使用UTF16编码。您可以编写自己的覆盖类,接受不同的编码:
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; }
}
}
因此,您可以使用下面的代码:
using(var stringWriter = new StringWriterWithEncoding( Encoding.UTF8))
{
...
}
发布于 2012-02-27 10:11:12
您应该从具有覆盖编码属性的StringWriter派生一个新类。
https://stackoverflow.com/questions/9459184
复制相似问题