如何解决反序列化中的此错误?

时间:2018-10-13 01:41:34

标签: c# deserialization

  

在sCreator.exe中发生了类型为'System.InvalidCastException'的未处理的异常   其他信息:无法将类型为“ System.String”的对象转换为类型为“ sCreator.Shape”。

代码如下:

<?xml version='1.0' encoding='utf8'?>
<collection>
    <genre category="Action">
        <decade years="1980s">
            <movie favorite="True" title="Indiana Jones: The raiders of 
              the lost Ark">
                <format multiple="No">DVD</format>
                <year>1981</year>
                <rating>PG</rating>
                <description>
                'Archaeologist and adventurer Indiana Jones 
                is hired by the U.S. government to find the Ark of the 
                Covenant before the Nazis.'
                </description>
            </movie>
               <movie favorite="True" title="THE KARATE KID">
               <format multiple="Yes">DVD,Online</format>
               <year>1984</year>
               <rating>PG</rating>
               <description>None provided.</description>
            </movie>
            <movie favorite="False" title="Back 2 the Future">
               <format multiple="False">Blu-ray</format>
               <year>1985</year>
               <rating>PG</rating>
               <description>Marty McFly</description>
            </movie>
        </decade>
        <decade years="1990s">
            <movie favorite="False" title="X-Men">
               <format multiple="Yes">dvd, digital</format>
               <year>2000</year>
               <rating>PG-13</rating>
               <description>Two mutants come to a private academy for     >                     their kind whose resident superhero team must 
                oppose a terrorist organization with similar powers. 
               </description>
            </movie>
            <movie favorite="True" title="Batman Returns">
               <format multiple="No">VHS</format>
               <year>1992</year>
               <rating>PG13</rating>
               <description>NA.</description>
            </movie>
               <movie favorite="False" title="Reservoir Dogs">
               <format multiple="No">Online</format>
               <year>1992</year>
               <rating>R</rating>
               <description>WhAtEvER I Want!!!?!</description>
            </movie>
        </decade>    
    </genre>

    <genre category="Thriller">
        <decade years="1970s">
            <movie favorite="False" title="ALIEN">
                <format multiple="Yes">DVD</format>
                <year>1979</year>
                <rating>R</rating>
                <description>"""""""""</description>
            </movie>
        </decade>
        <decade years="1980s">
            <movie favorite="True" title="Ferris Bueller's Day Off">
                <format multiple="No">DVD</format>
                <year>1986</year>
                <rating>PG13</rating>
                <description>Funny movie about a funny guy</description>
            </movie>
            <movie favorite="FALSE" title="American Psycho">
                <format multiple="No">blue-ray</format>
                <year>2000</year>
                <rating>Unrated</rating>
                <description>psychopathic Bateman</description>
            </movie>
        </decade>
    </genre>

    <genre category="Comedy">
        <decade years="1960s">
            <movie favorite="False" title="Batman: The Movie">
                <format multiple="Yes">DVD,VHS</format>
                <year>1966</year>
                <rating>PG</rating>
                <description>What a joke!</description>
            </movie>
        </decade>
        <decade years="2010s">
            <movie favorite="True" title="Easy A">
                <format multiple="No">DVD</format>
                <year>2010</year>
                <rating>PG--13</rating>
                <description>Emma Stone = Hester Prynne</description>
            </movie>
            <movie favorite="True" title="Dinner for SCHMUCKS">
                <format multiple="Yes">DVD,digital,Netflix</format>
                <year>2011</year>
                <rating>Unrated</rating>
                <description>Tim (Rudd) is a rising executive who 
                 'succeeds' in finding the perfect guest, IRS employee 
                 Barry (Carell), for his boss' monthly event, a so-called 
                 'dinner for idiots,' which offers certain advantages to 
                 the exec who shows up with the biggest buffoon.
                </description>
            </movie>
        </decade>
        <decade years="1980s">
            <movie favorite="False" title="Ghostbusters">
                <format multiple="No">Online,VHS</format>
                <year>1984</year>
                <rating>PG</rating>
                <description>Who ya gonna call?</description>
            </movie>
        </decade>
        <decade years="1990s">
            <movie favorite="True" title="Robin Hood: Prince of Thieves">
                <format multiple="No">Blu_Ray</format>
                <year>1991</year>
                <rating>Unknown</rating>
                <description>Robin Hood slaying</description>
            </movie>
        </decade>
    </genre>
</collection>

形状类别

    public void Deseriaize(StreamReader file)
    {
        XmlSerializer ser = new XmlSerializer(typeof(string));
        Shape s = (Shape)ser.Deserialize(file);
        file.Close();
        MessageBox.Show(s.title);
    }

    private void btn_OpenProject_Click(object sender, EventArgs e)
    {
        StreamReader file = new StreamReader(@"C:\Users\pb8n0053\Documents\SerializationOverview.seal");
        Deseriaize(file);
    }

1 个答案:

答案 0 :(得分:3)

正在使用XmlSerializer作为构造函数的参数来创建您的typeof(string)。这意味着串行器旨在将XML与System.String之间进行转换。如果您希望它将XML与Shape类型之间进行转换,则可以使用该类型进行初始化:

public void Deseriaize(StreamReader file)
{
    XmlSerializer ser = new XmlSerializer(typeof(Shape));
    Shape s = (Shape)ser.Deserialize(file);
    file.Close();
    MessageBox.Show(s.title);
}

请注意,如果您尝试反序列化不是用XmlSerializer创建的XML,或者您的Shape类未正确实现ISerializable,则序列化/反序列化周期可能会失败或无法正常工作