C# 为序列化排序XML元素

C# 为序列化排序XML元素,c#,xml,serialization,C#,Xml,Serialization,我必须按一定顺序将对象序列化为XML文档 <?xml version="1.0"?> <__Root __version="1.1" __encryption="2"> <__service __serviceType="Test"> <__inputData> <BaseToChange> <__name>TestName</__name> </BaseToChange>

我必须按一定顺序将对象序列化为XML文档

<?xml version="1.0"?>
<__Root __version="1.1" __encryption="2">
  <__service __serviceType="Test">
  <__inputData>
   <BaseToChange>
    <__name>TestName</__name>
   </BaseToChange>
  </__inputData>
  <__perform> 
   <__eventName>Event</__eventName>
  </__perform>    
  <__inputData>
      <ObjectChanges>
        <Name>Test</Name>
      </ObjectChanges>
    </__inputData>
    <__execute />
    <__requestData>
      <CompletionMsg />
    </__requestData>
  </__service>
</__Root>

订单必须如图所示。因此,首先是
,然后是
,然后是剩余的

我已经尝试分离属性,因此分离XmlElements,但是当我想用两个同名元素序列化时,我得到了一个错误


有人知道如何实现这一点吗?

您可以利用多态元素功能创建一个代理对象数组,该数组包含
Perform
InputData
对象,顺序正确:

public class Service
{
    [XmlAttribute("__serviceType")]
    public string ServiceType { get; set; }

    [XmlIgnore]
    public Perform Perform { get; set; }

    [XmlIgnore]
    public List<InputData> InputData { get; set; }

    [XmlElement("__perform", Type = typeof(Perform))]
    [XmlElement("__inputData", Type = typeof(InputData))]
    public object[] XmlInputAndPerformance
    {
        get
        {
            var inputData = (InputData ?? Enumerable.Empty<InputData>()).Cast<object>();
            var performData = Perform == null ? Enumerable.Empty<object>() : new object[] { Perform };

            return inputData.Take(1)
                .Concat(performData)
                .Concat(inputData.Skip(1))
                .ToArray();
        }
        set
        {
            if (value == null)
                return;
            var newInputs = value.OfType<InputData>().ToList();
            var newPerform = value.OfType<Perform>().ToList();
            if (newInputs.Count + newPerform.Count != value.Length)
                throw new ArgumentException("Unknown type.");
            if (newPerform.Count > 1)
                throw new ArgumentException("Too many Perform objects.");

            if (newPerform.Count > 0)
                Perform = newPerform[0];
            (InputData = InputData ?? new List<InputData>()).AddRange(newInputs);
        }
    }

    [XmlElement("__execute")]
    public Execute Execute { get; set; }

    [XmlElement("__requestData")]
    public RequestData RequestData { get; set; }

    public Service() { }
}
公共类服务
{
[XmlAttribute(“_服务类型”)]
公共字符串服务类型{get;set;}
[XmlIgnore]
公共执行{get;set;}
[XmlIgnore]
公共列表输入数据{get;set;}
[XmlElement(“_-perform”,Type=typeof(perform))]
[XmlElement(“\uuuInputData”,Type=typeof(inputData))]
公共对象[]XmlInputPerformance
{
得到
{
var inputData=(inputData??Enumerable.Empty()).Cast();
var performData=Perform==null?Enumerable.Empty():新对象[]{Perform};
返回inputData.Take(1)
.Concat(性能数据)
.Concat(inputData.Skip(1))
.ToArray();
}
设置
{
如果(值==null)
返回;
var newInputs=value.OfType().ToList();
var newPerform=value.OfType().ToList();
if(newInputs.Count+newPerform.Count!=value.Length)
抛出新ArgumentException(“未知类型”);
如果(newPerform.Count>1)
抛出新ArgumentException(“执行对象太多”);
如果(newPerform.Count>0)
Perform=newPerform[0];
(InputData=InputData??新建列表()).AddRange(新建输入);
}
}
[XmlElement(“_执行”)]
公共执行{get;set;}
[XmlElement(“_请求数据”)]
公共请求数据请求数据{get;set;}
公共服务(){}
}
请注意,原始的
InputData
Perform
属性已标记为,并且添加了两个
[xmlement(name,Type=typeof(TElement))]
属性,一个用于
InputData
,另一个用于
Perform


示例。

您可以利用多态元素功能创建一个代理对象数组,该数组包含
Perform
InputData
对象,顺序正确:

public class Service
{
    [XmlAttribute("__serviceType")]
    public string ServiceType { get; set; }

    [XmlIgnore]
    public Perform Perform { get; set; }

    [XmlIgnore]
    public List<InputData> InputData { get; set; }

    [XmlElement("__perform", Type = typeof(Perform))]
    [XmlElement("__inputData", Type = typeof(InputData))]
    public object[] XmlInputAndPerformance
    {
        get
        {
            var inputData = (InputData ?? Enumerable.Empty<InputData>()).Cast<object>();
            var performData = Perform == null ? Enumerable.Empty<object>() : new object[] { Perform };

            return inputData.Take(1)
                .Concat(performData)
                .Concat(inputData.Skip(1))
                .ToArray();
        }
        set
        {
            if (value == null)
                return;
            var newInputs = value.OfType<InputData>().ToList();
            var newPerform = value.OfType<Perform>().ToList();
            if (newInputs.Count + newPerform.Count != value.Length)
                throw new ArgumentException("Unknown type.");
            if (newPerform.Count > 1)
                throw new ArgumentException("Too many Perform objects.");

            if (newPerform.Count > 0)
                Perform = newPerform[0];
            (InputData = InputData ?? new List<InputData>()).AddRange(newInputs);
        }
    }

    [XmlElement("__execute")]
    public Execute Execute { get; set; }

    [XmlElement("__requestData")]
    public RequestData RequestData { get; set; }

    public Service() { }
}
公共类服务
{
[XmlAttribute(“_服务类型”)]
公共字符串服务类型{get;set;}
[XmlIgnore]
公共执行{get;set;}
[XmlIgnore]
公共列表输入数据{get;set;}
[XmlElement(“_-perform”,Type=typeof(perform))]
[XmlElement(“\uuuInputData”,Type=typeof(inputData))]
公共对象[]XmlInputPerformance
{
得到
{
var inputData=(inputData??Enumerable.Empty()).Cast();
var performData=Perform==null?Enumerable.Empty():新对象[]{Perform};
返回inputData.Take(1)
.Concat(性能数据)
.Concat(inputData.Skip(1))
.ToArray();
}
设置
{
如果(值==null)
返回;
var newInputs=value.OfType().ToList();
var newPerform=value.OfType().ToList();
if(newInputs.Count+newPerform.Count!=value.Length)
抛出新ArgumentException(“未知类型”);
如果(newPerform.Count>1)
抛出新ArgumentException(“执行对象太多”);
如果(newPerform.Count>0)
Perform=newPerform[0];
(InputData=InputData??新建列表()).AddRange(新建输入);
}
}
[XmlElement(“_执行”)]
公共执行{get;set;}
[XmlElement(“_请求数据”)]
公共请求数据请求数据{get;set;}
公共服务(){}
}
请注意,原始的
InputData
Perform
属性已标记为,并且添加了两个
[xmlement(name,Type=typeof(TElement))]
属性,一个用于
InputData
,另一个用于
Perform


样本。

可能重复:介于两者之间是什么意思?你是说列表中的项目1,然后执行,然后是列表中的项目2?听起来你的结构应该是redesigned@Ofir怀恩加登:没错。我需要此结构,否则我尝试在其中创建对象的系统(通过XML)会抛出错误。1)您希望如何控制
元素的显示位置?它总是在第一个
之后,或者它可以变化吗?2) 您的
InputData
类型是什么样的?看起来它有时有一个
元素,有时有一个
元素?顺序必须如图所示。所以首先是
,然后是``然后是
。“InputData”类型实际上有两个对象:
BaseToChange
ObjectChanges
可能的重复:介于两者之间是什么意思?你是说列表中的项目1,然后执行,然后是列表中的项目2?听起来你的结构应该是redesigned@Ofir怀恩加登:没错。我需要此结构,否则我尝试在其中创建对象的系统(通过XML)会抛出错误。1)您希望如何控制
元素的显示位置?它总是在第一个
之后,或者它可以变化吗?2) 您的
InputData
类型是什么样的?看起来它有时有一个
元素,有时有一个
元素?顺序必须如图所示。所以首先是
,然后是``然后是
。“InputData”类型实际上有两个对象:
BaseToChange
a