ASCII に最適な XML シリアライザーがありますが、ASCII 以外の文字が検出されると、疑問符「?」に置き換えられます。UTF8 用に正しく構成されていると思いますが、なぜこれを行っているのかわかりません。
XmlSerializer xmls = new XmlSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
{
XmlWriterSettings settings = new XmlWriterSettings();
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
settings.Encoding = Encoding.UTF8;
settings.Indent = true;
settings.NewLineChars = "\n";
settings.NewLineHandling = NewLineHandling.None;
settings.NewLineOnAttributes = false;
settings.ConformanceLevel = ConformanceLevel.Document;
settings.OmitXmlDeclaration = true;
using (XmlWriter writer = XmlTextWriter.Create(ms, settings))
{
xmls.Serialize(writer, obj, ns);
}
string xml = Encoding.UTF8.GetString(ms.ToArray());
// remove the BOM character at the beginning which screws up decoding
if (xml.Length > 0 && xml[0] != '<')
{
xml = xml.Substring(1, xml.Length - 1);
}
return xml;
}