XML序列化问题

问题描述:

我有以下类XML序列化问题

[Serializable] 
[XmlRoot("fileset")] 
public class FileSet 
{ 
    [XmlArray("")] 
    [XmlArrayItem(ElementName="file")] 
    public List<File> Files { get; set; } 

    [XmlAttribute("complete")] 
    public string Complete { get; set; } 

    [XmlAttribute("id")] 
    public string ID { get; set; } 

    [XmlAttribute("search_expression")] 
    public string Search_Expression { get; set; } 

    [XmlAttribute("format_expression")] 
    public string Format_Expression { get; set; } 

    public FileSet() 
    { } 

} 

[Serializable] 
[XmlRoot("file")]  
public class File 
{ 
    [XmlElement("action")] 
    public List<Action> Actions { get; set; } 

    [XmlAttribute("type")] 
    public string Type { get; set; } 

    [XmlAttribute("format")] 
    public string Format { get; set; } 

    [XmlAttribute("filefound")] 
    public string FileFound { get; set; } 

    [XmlAttribute("filename")] 
    public string FileName { get; set; } 

    [XmlAttribute("size")] 
    public long Size { get; set; } 

    [XmlAttribute("creationTime")] 
    public DateTime CreationTime { get; set; } 

    public File() { } 

} 

[Serializable] 
[XmlRoot("action")] 
public class Action 
{ 
    [XmlAttribute("task")] 
    public string Task { get; set; } 

    [XmlAttribute("sequenceid")] 
    public int SequenceId { get; set; } 

    [XmlAttribute("source")] 
    public string Source { get; set; } 

    [XmlAttribute("destination")] 
    public string Destination { get; set; } 

    [XmlAttribute("desc")] 
    public string Description { get; set; } 

    public Action() 
    { } 

} 

我提供的XML是以下类型的

<fileset complete="y" id="NY1109162" search_expression="" format_expression=""> 
    <file type="Datafile" format="NYyymmddn.zip" filefound="y" filename="NY1109162.zip" size="91703" creationTime=""> 
    <actions> 
     <action task="move" sequenceid="1" source="" destination="" desc="move to archive"></action> 
     <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action> 
     <action task="unzip" sequenceid="3" source="" destination="" desc="unzip files to working directory"></action> 
    </actions> 
    </file> 
    <file type="Repfile" format="NYyymmddn.rep" filefound="y" filename="NY1109162.rep" size="17" creationTime=""> 
    <actions> 
     <action task="copy" sequenceid="1" source="" destination="" desc="copy to archive"></action> 
     <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action> 
    </actions> 
    </file> 
    <file type="Imagefile" format="NYyymmddn_images.zip" filefound="y" filename="NY1109162_images.zip" size="116550" creationTime=""> 
    <actions> 
     <action task="move" sequenceid="1" source="" destination="" desc="move to archive"></action> 
     <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action> 
     <action task="unzip" sequenceid="3" source="" destination="" desc="unzip files to working directory"></action> 
    </actions> 
    </file> 
</fileset> 

但是,当我序列化我的文件集对象回到XML,然后将其添加在我不想要的额外标签上。 序列化输出是,

<fileset complete="y" id="NY1109162" search_expression="" format_expression=""> 
<Files> 
    <file type="Datafile" format="NYyymmddn.zip" filefound="y" filename="NY1109162.zip" size="91703" creationTime=""> 
    <actions> 
     <action task="move" sequenceid="1" source="" destination="" desc="move to archive"></action> 
     <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action> 
     <action task="unzip" sequenceid="3" source="" destination="" desc="unzip files to working directory"></action> 
    </actions> 
    </file> 
    <file type="Repfile" format="NYyymmddn.rep" filefound="y" filename="NY1109162.rep" size="17" creationTime=""> 
    <actions> 
     <action task="copy" sequenceid="1" source="" destination="" desc="copy to archive"></action> 
     <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action> 
    </actions> 
    </file> 
    <file type="Imagefile" format="NYyymmddn_images.zip" filefound="y" filename="NY1109162_images.zip" size="116550" creationTime=""> 
    <actions> 
     <action task="move" sequenceid="1" source="" destination="" desc="move to archive"></action> 
     <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action> 
     <action task="unzip" sequenceid="3" source="" destination="" desc="unzip files to working directory"></action> 
    </actions> 
    </file> 
</Files> 
</fileset> 

有人能帮忙吗?

我怀疑你可以改变这一点 - 这看起来像预期的行为,因为以下 - 解串器应该知道它应该把你的<文件>条目回来。所以它会在你的条目中添加额外的标签。 想象一下,你将有2个列表类型属性

[XmlArray("")] 
[XmlArrayItem(ElementName="file")] 
public List<File> Files { get; set; } 

[XmlArray("")] 
[XmlArrayItem(ElementName="file")] 
public List<File> ProcessedFiles { get; set; } 

如果你将被允许连载所有的文件项同级孩子的 - 你将无法反序列化回 - 因为你无法指定 - 应该放置每个<文件>。

您可以使用手动xml序列化,如果指定,则严格要求XML并且不能更改。

+0

是的,绝对正确!我没有想过这个。现在我已经实现了我自己的xml序列化器。 – Sagar 2011-12-16 09:06:35

XmlSerializer不是全部可扩展的。如果你打算使用它,你必须接受你的数据格式的一些妥协。这里有一些可能的方式来摆脱对数组中间元件的:

  • 更改FileSet类直接覆盖List<File>的而不是一个单独的列表属性。这将摆脱外部元素,但是你失去了指定数组项元素名称的能力。
  • 在您的FileSet课上实施IXmlSerializable。这很困难,因为它迫使你手动编写你自己的序列化和反序列化代码(这通常是你在使用XmlSerializer时要避免的)。
  • 停止使用XmlSerializer并切换到更灵活的串行器,如DataContractSerializer。这不像XmlSerializer那么简单,但它给你更多的自由来指定一个确切的格式。
+0

好吧,我明白了。感谢您的回复 – Sagar 2011-12-16 09:05:16