XMLSerializer会破坏我文件的一部分,为什么?

时间:2016-05-25 12:56:42

标签: c# xml wpf xml-parsing xmlserializer

我只是想反序列化,然后当我的对话框再次关闭时,在我的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>

1 个答案:

答案 0 :(得分:2)

不完全清楚您的XML发生了什么(除了它无效)。你说它有点像这样&#39; - 绝对看起来像是有帮助的。我会注意到您使用了错误的FileMode,所以我希望这是其中的一部分,我的猜测是您的实际 XML关闭了MainModel第一行。

FileMode.OpenOrCreatethe documentation中有这些评论:

  

指定操作系统应该打开文件(如果存在);否则,应创建一个新文件。

这意味着如果您的文件已经存在(就像它一样),那么序列化程序只会写入它。在写作之前文件不会被截断,所以如果你写的东西比那里的短,那么你最终会得到一个腐败的输出,由你所做的和#39组成。写完之前有什么。

你想要的是FileMode.Create,它有以下评论:

  

指定操作系统应创建新文件。如果该文件已存在,则将被覆盖。 ... FileMode.Create等同于请求如果文件不存在,则使用CreateNew;否则,请使用截断。

请注意,现有文件将被截断,这样可以避免此问题。