2013-12-11 3 views
0

Iv Сериализовал список и список для разделения файлов xml с помощью этого метода.C# xamlParseException при десериализации файла xml

 private void Save(String filePath,Type saveType) 
    { 
     // Create a new file stream to write the serialized object to a file 
     TextWriter WriteFileStream = new StreamWriter(@filePath); 

     // Create a new XmlSerializer instance with the type of List<Journey> and my addition types 


     if (saveType == typeof(List<Vechicle>)) 
     { 
      XmlSerializer SerializerObj = new XmlSerializer(saveType); 
      //serialising my vechicle list 
      SerializerObj.Serialize(WriteFileStream, Vechicle); 
     } 
     else 
     { 
      if (saveType == typeof(List<Journey>)) 
      { 
       Type [] extraTypes= new Type[1]; 
       extraTypes[0] = typeof(Tour); 
       XmlSerializer SerializerObj = new XmlSerializer(saveType,extraTypes); 
       SerializerObj.Serialize(WriteFileStream, Journey); 
      } 
     } 

     // Cleanup 
     WriteFileStream.Close(); 
    } 

это пример файла vechicls XML

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfVechicle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<Vechicle> 
<Id>1</Id> 
<Registration>a</Registration> 
</Vechicle> 
<Vechicle> 
<Id>2</Id> 
<Registration>b</Registration> 
</Vechicle> 
<Vechicle> 
<Id>3</Id> 
<Registration>c</Registration> 
</Vechicle> 
</ArrayOfVechicle> 

Проблема возникает, когда им пытаются загрузить дату Vechicle обратно в мой список, используя этот метод

private void Load() 
    { 

     XmlSerializer SerializerObj = new XmlSerializer(typeof(Vechicle)); 
     FileStream fs = new FileStream(filepath, FileMode.Open); 
     Vechicle = ((List<Vechicle>)SerializerObj.Deserialize(fs)); 
    } 

я получаю исключение в последней строке метода загрузки. «System.Windows.Markup.XamlParseException» произошел в PresentationFramework.dll «Вызов конструктора типа SD2CW2.MainWindow, который соответствует указанным ограничениям привязки, сделал исключение».

+0

Является ли 'Load()' вызывается в конструкторе 'SD2CW2.MainWindow'? Если это так, вам может потребоваться дважды проверить путь к файлу. Вы выбрали правильный путь к файлу? Или, может быть, вы можете вставить немного больше информации об исключениях. – Colin

ответ

0

Вы сериализовать List<Vechicle> и вы должны десериализации того же типа:

XmlSerializer SerializerObj = new XmlSerializer(typeof(List<Vechicle>)); 
FileStream fs = new FileStream(filepath, FileMode.Open); 
var Vechicles = ((List<Vechicle>)SerializerObj.Deserialize(fs)); 

Вы видите XamlParseException beacuse сериализации Возникла исключение вместо критических для WPF и обертывание исключения serializarion в XamlParseException. Вы можете увидеть это в свойстве InnerException экземпляра XamlParseException.

Но на самом деле в коде десериализации вы должны обращаться с обоими типами List<Journey> и List<Vechicle>. Как вы не сохраните все метаданные в файле (тип был сериализованная), так что ваш код может выглядеть так:

FileStream fs = new FileStream(filepath, FileMode.Open); 
List<Vechicle> Vechicles = null; 
List<Journey> Journeys = null; 

try 
{ 
    XmlSerializer SerializerObj = new XmlSerializer(typeof(List<Vechicle>)); 
    Vechicles = ((List<Vechicle>)SerializerObj.Deserialize(fs)); 
} 
catch 
{ 
    Type [] extraTypes= new Type[] { typeof(Tour) }; 
    XmlSerializer SerializerObj = new XmlSerializer(saveType, extraTypes); 
    Journeys = ((List<Journey>)SerializerObj.Deserialize(fs)); 
} 

if (Vechicles != null) 
{ 
    // do something 
} 
else if (Journeys != null) 
{ 
    // do something 
} 

Обратите внимание, что исключения все еще может произойти здесь, если XmlSerializer не десериализации обоих типов.

+0

получил работу за вашу помощь – James

Смежные вопросы