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

时间:2016-01-03 19:30:00

标签: c# xml serialization

我目前正在使用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();
        }
    }`

我目前有什么东西可以忽略吗?我在大量项目中使用这种方法取得了巨大成功。 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:4)

这是问题所在:

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

如果文件已经存在,不会截断文件 - 它只会覆盖它写入的数据,但如果原始文件长于序列化程序写入的数据,则& #34;旧&#34;数据留在最后。

只需使用

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

(那么你也不需要尝试/终于 - 总是使用using语句来获取资源......)