2016-05-25 7 views
0

Я просто пытаюсь десериализоваться, а затем, когда мой диалог закрывается, снова сериализуем XML-файл в моем приложении WPF. Ну, это работает большую часть времени, но иногда некоторые персонажи в моем файле полностью потеряны, они просто исчезают, что делает файл непригодным. Мой код:XMLSerializer уничтожает части моего файла, почему?

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

Можете ли вы сбросить код класса MyModel –

+1

Вы уверены, что вставили правильный Xml для после? Закрытие не имеет соответствующего стартового тега. – loopedcode

+1

Знаете ли вы, какие символы потеряны в процессе? Помимо отсутствующего ярлыка открытия, я не вижу никаких изменений в до и после вашего размещения. Может быть, вы пытаетесь отправить недопустимые символы XML? – counterflux

ответ

2

Это не совсем ясно, что случилось с вашим XML (кроме это инвалид). Вы говорите, что это «как это» - то, что это определенно выглядит как бы полезно. Я бы заметил, что вы используете неправильный FileMode, поэтому я ожидаю, что это часть его, и я предполагаю, что ваш действительный XML закрывает MainModel на первой строке.

FileMode.OpenOrCreate имеет эти комментарии в the documentation:

Указывает, что операционная система должна открыть файл, если он существует; в противном случае должен быть создан новый файл.

Это означает, что если ваш файл уже существует (как он есть), то сериализатор просто напишет на него. Файл не будет усечен, прежде чем писать, поэтому, если то, что вы пишете, короче того, что есть, вы получите коррумпированный результат, составленный из того, что вы написали и что было раньше.

Что вы хотите FileMode.Create, который имеет следующие комментарии:

Указывает, что операционная система должна создать новый файл. Если файл уже существует, он будет перезаписан. ... FileMode.Create эквивалентно запросу, если файл не существует, используйте CreateNew; в противном случае используйте Truncate.

Обратите внимание, что существующий файл будет обрезан, что позволит избежать этой проблемы.