簡體   English   中英

訂購XML元素以進行序列化

[英]Order XML elements for serialization

我必須按特定順序將對象序列化為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>

我現在List<InputData>的問題是我無法使用Element Perform之間序列化我的List<InputData>

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

    [XmlElement("__perform")]
    public Perform Perform { get; set; }

    [XmlElement("__inputData")]
    public List<InputData> InputData{ get; set; }

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

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

    public Service() { }
}

訂單必須如圖所示。 首先是<__inputData> ,然后是<__perform> ,然后是剩余的<__inputData>

我已經嘗試將屬性和XmlElements分開,但是一旦我想用兩個具有相同名稱的元素序列化,我就會收到錯誤。

有誰知道如何實現這一目標?

您可以利用多態元素功能[XmlElement(Type = typeof(TElement))]以正確的順序創建包含PerformInputData對象的代理對象數組:

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() { }
}

請注意,原始的InputDataPerform屬性已標記為[XmlIgnore]並且已添加兩個[XmlElement(name, Type = typeof(TElement))]屬性,一個用於InputData ,另一個用於Perform

樣品小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM