我目前正在使用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();
}
}`
我目前有什么东西可以忽略吗?我在大量项目中使用这种方法取得了巨大成功。 任何帮助将不胜感激!
答案 0 :(得分:4)
这是问题所在:
FileStream stream = File.Open(fullpath, FileMode.OpenOrCreate);
如果文件已经存在,不会截断文件 - 它只会覆盖它写入的数据,但如果原始文件长于序列化程序写入的数据,则& #34;旧&#34;数据留在最后。
只需使用
using (var stream = File.Create(fullPath))
{
...
}
(那么你也不需要尝试/终于 - 总是使用using
语句来获取资源......)