簡體   English   中英

反序列化xml文件時c#xamlParseException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM