序列化根标记时出现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();
}
}`
有什么我现在忽略的吗?我已经在许多项目中使用了这种方法,并取得了巨大的成功。如有任何帮助,我们将不胜感激!
这就是问题所在:
FileStream stream = File.Open(fullpath, FileMode.OpenOrCreate);
如果文件已经存在,则不会截断文件-它只是覆盖它写入的数据,但如果原始文件比序列化程序写入的数据长,则"旧"数据会留在末尾。
只需使用
using (var stream = File.Create(fullPath))
{
...
}
(那么您也不需要try/finally-总是对资源使用using
语句…)