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并且不能更改。
答
XmlSerializer
不是全部可扩展的。如果你打算使用它,你必须接受你的数据格式的一些妥协。这里有一些可能的方式来摆脱对数组中间元件的:
- 更改
FileSet
类直接覆盖List<File>
的而不是一个单独的列表属性。这将摆脱外部元素,但是你失去了指定数组项元素名称的能力。 - 在您的
FileSet
课上实施IXmlSerializable
。这很困难,因为它迫使你手动编写你自己的序列化和反序列化代码(这通常是你在使用XmlSerializer
时要避免的)。 - 停止使用
XmlSerializer
并切换到更灵活的串行器,如DataContractSerializer
。这不像XmlSerializer
那么简单,但它给你更多的自由来指定一个确切的格式。
+0
好吧,我明白了。感谢您的回复 – Sagar 2011-12-16 09:05:16
是的,绝对正确!我没有想过这个。现在我已经实现了我自己的xml序列化器。 – Sagar 2011-12-16 09:06:35