2011-09-24 107 views
3

我tryind反序列化XML文件转换成对象[] - 对象是具有以下字段如何将xml反序列化为对象数组?

矩形
public class Rectangle : IXmlSerializable 
{ 
    public string Id { get; set; } 
    public Point TopLeft { get; set; } 
    public Point BottomRight { get; set; } 
    public RgbColor Color { get; set; } 
} 

我创建几个矩形,它们保存到一个数组并设法它们序列化到的XML我得到的语法如下:

<?xml version="1.0" encoding="utf-8" ?> 
- <Rectangles> 
- <Rectangle> 
    <ID>First one</ID> 
    - <TopLeft> 
    <X>0.06</X> 
    <Y>0.4</Y> 
    </TopLeft> 
    - <BottomRight> 
    <X>0.12</X> 
    <Y>0.13</Y> 
    </BottomRight> 
    - <RGB_Color> 
    <Blue>5</Blue> 
    <Red>205</Red> 
    <Green>60</Green> 
    </RGB_Color> 
    </Rectangle> 

-

现在我想反序列化对象的矩形返回到一个新的矩形[] 我应该怎么办呢?

XmlSerializer mySerializer = new XmlSerializer(typeof(Rectangle)); 
     FileStream myFileStream = new FileStream("rectangle.xml", FileMode.Open); 
     Rectangle[] r = new Rectangle[] {}; 
     Rectangle rec; 
     for (int i = 0; i < 3; i++) 
     { 
      r[i] = (Rectangle) mySerializer.Deserialize(myFileStream); 
     } 

我得到一个InvalidOperationException异常 - {“有是XML文档(1,40)中的错误。”} 我到底做错了什么?

谢谢

+4

你的方形XML标签没有结束。这是一个错字吗? –

回答

1

你的XML缺少结束</Rectangles>元素。这可能是问题!

1

问题是关于根元素名称。但是,Deserialize()只知道如何查找名为Rectangles的元素。 但在你的情况元素名为“矩形”。那就是所有的InvalidOperationException都在告诉你。

9

如果你的XML文档是有效的,你应该能够使用这个代码反序列化:

XmlSerializer mySerializer = new XmlSerializer(typeof(Rectangle[]), new XmlRootAttribute("Rectangles")); 
    using (FileStream myFileStream = new FileStream("rectangle.xml", FileMode.Open)) 
    { 
    Rectangle[] r; 
    r = (Rectangle[]) mySerializer.Deserialize(myFileStream); 
    } 
+2

如果你将'FileStream'放入'using'块中,那么我会提高你的答案。 –