序列化根标记时出现C#XmlSerializer错误

本文关键字:C#XmlSerializer 错误 序列化 | 更新日期: 2023-09-27 18:28:53

我当前正在使用XmlSerializer命名空间将HighScoreData从C#应用程序序列化到XML文件。这会产生与输出的XML文件不一致的结果。

我正在序列化的对象是以下结构:

namespace GameProjectTomNijs.GameComponents
{
    [Serializable]
    public struct HighScoreData
    {
        public string[] PlayerName;
        public int[] Score;
        public int Count;
        public readonly string HighScoresFilename;
        public HighScoreData(int count)
        {
            PlayerName = new string[count];
            Score = new int[count];
            Count = count;
            HighScoresFilename = "highscores.lst";
        }
    }
}

除了有问题的变量可访问性级别之外,它还包含一个字符串数组、一个整数数组和一个包含总对象的整数。这是正在序列化的数据。该的输出通常为:

<?xml version="1.0"?>
<HighScoreData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PlayerName>
    <string />
    <string>MISTERT</string>
    <string>TESTER</string>
    <string>PAULA</string>
    <string>JENS</string>
  </PlayerName>
  <Score>
    <int>554</int>
    <int>362</int>
    <int>332</int>
    <int>324</int>
    <int>218</int>
  </Score>
  <Count>5</Count>
</HighScoreData>

然而,在大约20-30%的时间里,它以一种特殊的方式写入XML文件,结束根标记将如下所示:</HighScoreData>oreData>

似乎写入XML文件的方法是附加值,而不是覆盖

以下代码是实际写入XML文件的方法:

public static void SaveHighScores(HighScoreData data, string fullpath)
    {
        // Open the file, creating it if necessary
        FileStream stream = File.Open(fullpath, FileMode.OpenOrCreate);
        try
        {
            // Convert the object to XML data and put it in the stream
            XmlSerializer serializer = new XmlSerializer(typeof(HighScoreData));
            serializer.Serialize(stream, data);
        }
        finally
        {
            // Close the file
            stream.Close();
        }
    }`

有什么我现在忽略的吗?我已经在许多项目中使用了这种方法,并取得了巨大的成功。如有任何帮助,我们将不胜感激!

序列化根标记时出现C#XmlSerializer错误

这就是问题所在:

FileStream stream = File.Open(fullpath, FileMode.OpenOrCreate);

如果文件已经存在,则不会截断文件-它只是覆盖它写入的数据,但如果原始文件比序列化程序写入的数据长,则"旧"数据会留在末尾。

只需使用

using (var stream = File.Create(fullPath))
{
    ...
}

(那么您也不需要try/finally-总是对资源使用using语句…)