XMLSerializer 发现未知节点

XMLSerializer finds unknown nodes

我有一个 XML 文件,我想将其反序列化为 C# class。

XML 文件如下所示:

<?xml version="1.0" ?>
<Animation name="Scene1">
<Object name="Object1">
    <Polygons>
        <Polygon vert0="1" vert1="2" vert2="0"/>
        <Polygon vert0="1" vert1="3" vert2="2"/>
    </Polygons>
    <Transform>
        <Frame Idx="1">
            <Location x="50.0" y="50.0" z="0.0"/>
            <Rotation x="0.0" y="0.0" z="0.0"/>
            <Scaling x="40.0" y="40.0" z="1.0"/>
        </Frame>
        <Frame Idx="60">
            <Location x="500.0" y="220.0" z="0.0"/>
            <Rotation x="0.0" y="0.0" z="0.0"/>
            <Scaling x="40.0" y="40.0" z="1.0"/>
        </Frame>
    </Transform>
</Object>
</Animation>

对于 C# 类 我有以下内容来表示动画:

[Serializable]
public class Animation
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlArray("Object")]
    public Object[] Objects { get; set; }

    public static Animation AnimationFactory(string filename)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Animation));
        serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
        serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);

        FileStream fs = new FileStream(filename, FileMode.Open);

        return (Animation)serializer.Deserialize(fs);
    }

    private static void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
    {
        Console.WriteLine("Unknown Node: " + e.Name);
    }

    private static void serializer_UnknownAttribute
    (object sender, XmlAttributeEventArgs e)
    {
        Console.WriteLine("Unknown Attribute: " + e.Attr.Name);
    }
}

对于对象:

[Serializable]
public class Object
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlElement("Polygons")]
    public Polygons Polygons { get; set; }

    [XmlElement("Transform")]
    public Transform Transforms { get; set; }
}

对于变换:

[Serializable]
public class Transform
{
    [XmlArray("Frame")]
    public FrameTRS[] Frames { get; set; }
}

FrameTRS 看起来像这样:

[Serializable]
[XmlInclude(typeof(Frame))]
public class FrameTRS : Frame
{
    [XmlElement]
    public Location Location { get; set; }

    [XmlElement]
    public Rotation Rotation { get; set; }

    [XmlElement]
    public Scaling Scaling { get; set; }
}

[Serializable]
public class Frame
{
    [XmlAttribute("Idx")]
    public int Index;
}

而每个位置、缩放、旋转都源自:

[Serializable]
[XmlInclude(typeof(Coordinates))]
public class Rotation : Coordinates
{
}

[Serializable]
public class Coordinates
{
    [XmlAttribute("x")]
    public double X { get; set; }

    [XmlAttribute("y")]
    public double Y { get; set; }

    [XmlAttribute("z")]
    public double Z { get; set; }
 }

对于我拥有的多边形:

[Serializable]
public class Polygons
{
    [XmlArray("Polygon")]
    public Polygon[] Polygon { get; set; }
}

[Serializable]
public class Polygon
{
    [XmlAttribute("vert0")]
    public int Vert0 { get; set; }

    [XmlAttribute("vert1")]
    public int Vert1 { get; set; }

    [XmlAttribute("vert2")]
    public int Vert2 { get; set; }

    [XmlAttribute("vert3")]
    public int Vert3 { get; set; }
}

当我调用 Animation.AnimationFactory("file") 时,我没有遇到异常,但返回的动画对象只有名称和一个空对象。 我在控制台中得到了这个输出,因为它无法识别节点: 未知节点:多边形 未知节点:变换

谁能帮帮我?谢谢!

我找到了解决方案,也许它会对某人有所帮助:

我将 XmlArray 属性更改为 XmlElement 属性,现在它可以正常工作了。