XmlSerialization.为两个类创建公共根

本文关键字:创建 两个 XmlSerialization | 更新日期: 2023-09-27 18:09:30

如何使用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 =)

XmlSerialization.为两个类创建公共根

您可以这样做,然后使用XmlSerializer序列化它。

为InputFile和OutputFile类中的属性也使用xmlatattribute。

 [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 >();
    }

有多种方法可以做到这一点。就我个人而言,我更喜欢添加新的父类,您可以向其添加InputFileOutputFile列表。然而,如果你不喜欢这个想法,你可以做其他两件事之一:

  1. 实现IXmlSerializable并自己处理
  2. 对于一个快速而肮脏的hack,你可以这样做:

string serialized = //however you normally serialize your xml

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

我不推荐最后一种方法,但是随你的便