3
            Person person = GetPerson();
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add(string.Empty, string.Empty);
            XmlSerializer serializer = new XmlSerializer(typeof(Person));
            string personText = string.Empty;
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, new XmlWriterSettings() { Encoding = Encoding.UTF8 }))
                {
                    serializer.Serialize(xmlWriter, person, ns);
                    xmlWriter.Flush();
                    personText = Encoding.UTF8.GetString(memoryStream.ToArray());
                }
            }

            string path = @"D:\person.xml";
// Write method 1:
            File.WriteAllText(path, personText);

// Write method 2:
            using (StreamWriter streamWriter = new StreamWriter(path, false , Encoding.UTF8))
            {
                streamWriter.Write(personText);
            }

// Read the xml
            using (FileStream fileStream = new FileStream(path, FileMode.Open))
            {
                return XDocument.Load(XmlReader.Create(fileStream));
            }

メソッド2を使用して書き込んだ後にxmlを読み取ると、ルートレベルでこのデータが無効になります。1行目、位置1。ただし、方法1を使用すると正常に機能します。

これを引き起こしているのは何ですか?どんなポインタでもありがたいです。

4

1 に答える 1

7

問題は、とStreamWriter 両方XmlWriterがバイト順マークを追加していることです。

オプション:

  • BOMpersonTextを最初から文字列化する
  • new UTF8Encoding(false)の代わりEncoding.UTF8にパスStreamWriter
  • new UTF8Encoding(false)の代わりEncoding.UTF8にパスXmlWriter
  • そもそもテキストに変換して元に戻すことは避けてください。バイナリデータがにあるので、それをディスクMemoryStreamにダンプしてみませんか?
于 2012-09-20T09:22:04.750 に答える