[英]c# xamlParseException when Deserializing an xml file
iv使用此方法序列化一個列表和一個列表以分隔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>
當我嘗試使用此方法將車輛日期重新加載到我的列表中時,問題就來了
private void Load()
{
XmlSerializer SerializerObj = new XmlSerializer(typeof(Vechicle));
FileStream fs = new FileStream(filepath, FileMode.Open);
Vechicle = ((List<Vechicle>)SerializerObj.Deserialize(fs));
}
我在load方法的最后一行遇到了異常。 'PresentationFramework.dll中發生'System.Windows.Markup.XamlParseException''與指定的綁定約束匹配的'SD2CW2.MainWindow'類型的構造函數調用引發了異常。
您已序列化List<Vechicle>
並且應反序列化相同類型:
XmlSerializer SerializerObj = new XmlSerializer(typeof(List<Vechicle>));
FileStream fs = new FileStream(filepath, FileMode.Open);
var Vechicles = ((List<Vechicle>)SerializerObj.Deserialize(fs));
您會看到XamlParseException,因為serialize異常發生在對WPF至關重要的位置,並且將serializarion異常包裝在XamlParseException
。 您可以在XamlParseException實例的InnerException
屬性中看到它。
但是實際上,在反序列化代碼中,您應該同時處理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不會反序列化這兩種類型,則這里仍然會發生異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.