Наличие или отсутствие спецификации не является определением «правильного текстового файла». На самом деле, я бы сказал, что наиболее типичным форматом в наши дни является UTF-8 без спецификации; Я не думаю, что я когда-либо видел, что кто-то действительно использует спецификацию UTF-8 в реальных системах! Но: если вам нужна спецификация, это нормально: просто введите правильный Encoding
в; если вы хотите UTF-8 с спецификацией:
using (var writer = XmlWriter.Create(myPath, s_settings))
{
XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
serializer.Serialize(writer, obj);
}
с:
static readonly XmlWriterSettings s_settings =
new XmlWriterSettings { Encoding = new UTF8Encoding(true) };
В результате получается файл, который запускает EF-BB-BF, спецификацию UTF-8.
Если вам нужна кодировка , отличающаяся от , просто замените new UTF8Encoding
на то, что вам нужно, не забывая включить спецификацию.
(примечание: статический экземпляр Encoding.UTF8
имеет включенную спецификацию, но IMO лучше быть очень явным, если вы намерены использовать спецификацию, точно так же, как вы должны четко указывать, какую Encoding
вы намеревались использовать)
Редактировать: ключевое отличие здесь в том, что Serialize(Stream, object)
заканчивается использованием:
XmlTextWriter xmlWriter = new XmlTextWriter(stream, encoding: null) {
Formatting = Formatting.Indented,
Indentation = 2
};
, который затем заканчивается использованием:
public StreamWriter(Stream stream) : this(stream,
encoding: UTF8NoBOM, // <==== THIS IS THE PROBLEM
bufferSize: 1024, leaveOpen: false)
{
}
итак: UTF-8 без спецификации используется по умолчанию, если вы используете этот API.