在 C# 中对 XmlSerializer 的输出进行排序

pro*_*eek 2 c# xml sorting xml-serialization

这篇文章中,我可以得到一个基于 C# 类生成的 XML 文件。

我可以根据其元素对 XML 元素重新排序吗?我的代码使用

var ser = new XmlSerializer(typeof(Module));
ser.Serialize(WriteFileStream, report, ns);
WriteFileStream.Close();
Run Code Online (Sandbox Code Playgroud)

获取 XML 文件,但我需要根据 BlocksCovered 变量对 XML 文件进行排序。

public class ClassInfo {
    public string ClassName;
    public int BlocksCovered;
    public int BlocksNotCovered;
    public double CoverageRate;

    public ClassInfo() {}

    public ClassInfo(string ClassName, int BlocksCovered, int BlocksNotCovered, double CoverageRate) 
    {
        this.ClassName = ClassName;
        this.BlocksCovered = BlocksCovered;
        this.BlocksNotCovered = BlocksNotCovered;
        this.CoverageRate = CoverageRate;
    }
}

[XmlRoot("Module")]
public class Module {
    [XmlElement("Class")]
    public List<ClassInfo> ClassInfoList;
    public int BlocksCovered;
    public int BlocksNotCovered;
    public string moduleName;

    public Module()
    {
        ClassInfoList = new List<ClassInfo>();
        BlocksCovered = 0;
        BlocksNotCovered = 0;
        moduleName = "";
    }
}

Module report = new Module();

...

TextWriter WriteFileStream = new StreamWriter(xmlFileName);
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
var ser = new XmlSerializer(typeof(Module));
ser.Serialize(WriteFileStream, report, ns);
WriteFileStream.Close();
Run Code Online (Sandbox Code Playgroud)

解决了

public void Sort()
{
    ClassInfoList = ClassInfoList.OrderBy( x=>x.CoverageRate).ToList();
}
Run Code Online (Sandbox Code Playgroud)

Bro*_*ass 5

只需在序列化之前对列表进行排序,它就会出现在您可以控制序列化的代码中 - 如果是这种情况,只需ClassInfoList在序列化模块之前通过添加Sort()方法对列表进行排序:

public class Module
{

  public void Sort()
  {
      ClassInfoList = ClassInfoList.OrderBy( x=>x.BlocksCovered).ToList();
  }
..
}
Run Code Online (Sandbox Code Playgroud)

然后在序列化之前调用 Sort():

report.Sort();
ser.Serialize(WriteFileStream, report, ns);
Run Code Online (Sandbox Code Playgroud)

如果您无法控制何时/以及如何序列化您的类,请让您的 Module 类IXmlSerializable在您的Serialize()方法中实现和排序- 不过后者需要更多的努力,应该避免。