反序列化单个对象

时间:2011-03-31 00:34:03

标签: c# .net xml-serialization

.Net 4中是否有一种方法可以逐个轻松地反序列化混合对象流?我可以使用XmlTextReader.Read()读取我想要反序列化的对象的元素的开头,但是尝试了很多方法来反序列化该特定对象失败。

我想要反序列化的类型可以作为这些类型的列表读取而没有使用XmlSerializer的问题,但是我希望能够混合它们而不是让输入文件只包含一个对象类型的列表。

e.g。

<Objects>
  <TypeA>...</TypeA>
  <TypeB>...</TypeB>
  <TypeA>...</TypeA>
  <TypeC>...</TypeC>
  ...
</Objects>

对象的排序是随机的。

非常感谢任何指示。

我已经看过XmlSerializer,DataContractSerializer和XElement,但是无法让它们为此工作(虽然我可能没有正确设置它们,因为我对它们不是很熟悉)。

3 个答案:

答案 0 :(得分:2)

您可以使用XmlSerializer执行此操作。

但是,请注意以下事项:

  1. 您正在序列化/反序列化的数组必须声明为“对象”的数组(如果所有其他类型都从其继承,则为基础对象)
  2. 每种类型都附加“xsi:type”
  3. 您必须使用[XmlInclude]包含“root”对象所需的所有类型。
  4. 需要[XmlInclude]所有对象类型意味着您无法动态地向序列化添加类型。您需要添加[XmlInclude]并重新编译以包含新类型。

    但是,您的XML将成为:

    <Objects>
      <TypeObj xsi:type="TypeA">...</TypeObj>
      <TypeObj xsi:type="TypeB">...</TypeObj>
      <TypeObj xsi:type="TypeA">...</TypeObj>
      <TypeObj xsi:type="TypeC">...</TypeObj>
          :
    </Objects>
    

    这是多种类型的XML序列化的最灵活和“正常”方式。但是,如果您需要保留确切的格式,可以这样声明您的课程:

    [XmlRoot("Objects")]
    public class Objects
    {
        [XmlElement("TypeA")] public TypeA[] TypeAObjects;
        [XmlElement("TypeB")] public TypeB[] TypeBObjects;
        [XmlElement("TypeC")] public TypeC[] TypeCObjects;
             :
    }
    

    [XmlElement]表示所有对象都在同一级别上混淆(与XmlArray不同)。他们甚至不必整理好。

    但是,这样做的缺陷是,如果要添加新类型,则必须修改“对象”类。

答案 1 :(得分:0)

不确定这是否有用,但可能需要了解RestSharp如何进行反序列化。 https://github.com/johnsheehan/RestSharp

具体看看RestSharp / Deserializers / XmlDeserializer.cs

答案 2 :(得分:0)

您需要为每种类型创建XmlSerializer。您拥有的类型数量以及每种类型的使用次数将决定在处理每个对象时是否更好地为每个对象创建新的XmlSerializer,或者将它们存储在Dictionary<string, XmlSerializer>中以便重复使用。 XmlSerializer在其构造函数中使用type,然后您可以调用Deserialize方法,向其传递StringReader,其中包含您从文件中读取的XML字符串。希望这足以让你开始,但如果你需要更多帮助我可以把一些示例代码放在一起;)