Xml序列化。为两个类创建公共根

时间:2013-04-16 10:04:49

标签: c# xml xml-serialization xmlserializer

如何使用XmlSerializer创建此类结构:

<Files Upload="True">
    <InputFiles>
        <InputFile File="file.txt" ErrorCode="0" Version="0"/>
        <InputFile File="file.txt" ErrorCode="0" Version="0"/>
    </InputFiles>
    <OutputFiles>
        <OutputFile File="file.txt" ErrorCode="0" Version="0"/>
        <OutputFile File="file.txt" ErrorCode="0" Version="0"/>
    </OutputFiles>
</Files>

问题是创建标记文件

现在我在某个类中有这样的代码,它正在为输入文件和输出文件进行序列化:

    private System.Collections.Generic.List<InputFile> _inputFiles = new System.Collections.Generic.List<InputFile>();
    [XmlIgnore]
    public virtual System.Collections.Generic.List<InputFile> InputFiles
    {
        get 
        {
            if (ModulesInBuild.ModulesList.Count != 0)
            {
                _inputFiles.Clear();
                foreach (var item in ModulesInBuild.ModulesList)
                {
                    _inputFiles.Add(item);
                }
            }
            return _inputFiles; 
        }
    }

    [XmlArray("InputFiles")]
    [XmlArrayItem("InputFile")]
    public virtual InputFile[] XmlInputFiles
    {
        get
        {
            var inputFiles = new InputFile[InputFiles.Count];
            InputFiles.CopyTo(inputFiles, 0);
            return inputFiles;
        }
        set
        {
            InputFiles.Clear();
            InputFiles.AddRange(value);
        }
    }

因此,重写很多代码只是为了添加标签Files =)

2 个答案:

答案 0 :(得分:0)

您可以执行此类操作,然后使用XmlSerializer对其进行序列化。

对InputFile和OutputFile类中的属性也使用XmlAttribute属性。

 [Serializable]   
 public class Files
    {
        public Files(){}

        [XmlAttribute()]
        public bool Upload{get;set;}

        public List<InputFile> InputFiles
           {
           get{retrun inputFiles;}
           set{inputFiles=value;}
           }
        List<InputFile> inputFiles = new List<InputFile>();

        public List<OutputFile > OutputFiles
           {
           get{return outputFiles ;}
           set{outputFiles =value;}
           }
        List<OutputFile > outputFiles = new List<OutputFile >();
    }

答案 1 :(得分:0)

有各种方法可以解决这个问题。就个人而言,我更喜欢添加您可以添加InputFileOutputFile列表的新父类。但是,如果你不喜欢这个想法,你可以做其他两件事之一:

  1. 实施IXmlSerializable并自行处理
  2. 对于快速而肮脏的黑客攻击,你可以这样做:
  3. string serialized = //however you normally serialize your xml

    string uglyHack = "<Files>" + serialized + "</Files>";

    我不会推荐最后一种方法,但不管你的船是什么漂浮......