我只是想反序列化,然后当我的对话框再次关闭时,在我的WPF应用程序中序列化一个XML文件。嗯,这大部分时间都有效,但有时候,我文件中的某些字符完全丢失,它们会消失,使文件无法使用。我的代码:
public static void WriteXML(MyModel MyModel)
{
try
{
XmlSerializer serializer = new XmlSerializer(typeof(MyModel));
using (var stream = new FileStream(fileName, FileMode.OpenOrCreate))
{
serializer.Serialize(stream, MyModel);
}
}
catch (Exception e)
{
//...
}
}
我的XML文件在之前和之后看起来有点像这样:
<?xml version="1.0"?>
<MainModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Main>
<SomeModel>
<ID>1</ID>
<Name>Af</Name>
<SomeMonth>February</SomeMonth>
<Level>10</Level>
<Out>120</Out>
<Hyb>true</Hyb>
</SomeModel>
<SomeModel>
<ID>2</ID>
<Name>Alm</Name>
<SomeMonth>March</SomeMonth>
<Level>5</Level>
<Out>90</Out>
<Hyb>true</Hyb>
</SomeModel>
</Main>
</MainModel>
后:
<?xml version="1.0"?>
<MainModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><SomeModel>
<ID>1</ID>
<Name>Af</Name>
<SomeMonth>February</SomeMonth>
<Level>10</Level>
<Out>120</Out>
<Hyb>true</Hyb>
</SomeModel>
<SomeModel>
<ID>2</ID>
<Name>Alm</Name>
<SomeMonth>March</SomeMonth>
<Level>5</Level>
<Out>90</Out>
<Hyb>true</Hyb>
</SomeModel>
</Main>
</MainModel>
答案 0 :(得分:2)
不完全清楚您的XML发生了什么(除了它无效)。你说它有点像这样&#39; - 绝对看起来像是有帮助的。我会注意到您使用了错误的FileMode
,所以我希望这是其中的一部分,我的猜测是您的实际 XML关闭了MainModel
第一行。
FileMode.OpenOrCreate
在the documentation中有这些评论:
指定操作系统应该打开文件(如果存在);否则,应创建一个新文件。
这意味着如果您的文件已经存在(就像它一样),那么序列化程序只会写入它。在写作之前文件不会被截断,所以如果你写的东西比那里的短,那么你最终会得到一个腐败的输出,由你所做的和#39组成。写完之前有什么。
你想要的是FileMode.Create
,它有以下评论:
指定操作系统应创建新文件。如果该文件已存在,则将被覆盖。 ... FileMode.Create等同于请求如果文件不存在,则使用CreateNew;否则,请使用截断。
请注意,现有文件将被截断,这样可以避免此问题。