Как исправить мой список неправильно сериализованных объектов - PullRequest
0 голосов
/ 29 марта 2019

У меня возникла проблема с правильной сериализацией объекта. У меня есть объект SensorSession, который выглядит так:



    [XmlRoot("Session")]
    public class SensorSession
    {
        [XmlElement("SensorDefinitionCollection")]
        public SensorDefinitionCollection mCollection { get; set; }
        [XmlElement("SensorRunner")]
        public SensorRunner mRunner { set; get; }
    }

    public class SensorDefinitionCollection : IEnumerable<SensorDefinition>
    {
        [XmlArray("SensorDefinitionCollection")]
        [XmlArrayItem("SensorDefinition")]
        public List<SensorDefinition> mCollection;
    }
    public class SensorDefinition : IEquatable<SensorDefinition>, IComparable<SensorDefinition>
    {
        [XmlElement("StartingWavelength")]
        public double startingWavelength { get; set; }
        [XmlElement("StoppingWavelength")]
        public double stoppingWavelength { get; set; }
        [XmlElement("TargetWavelength")]
        public double targetWavelength { get; set; }

    }

Когда я сериализуюсь, я получаю следующее:

<?xml version="1.0" encoding="utf-8"?>
<Session xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SensorDefinitionCollection>
    <StartingWavelength>1300</StartingWavelength>
    <StoppingWavelength>1400</StoppingWavelength>
    <TargetWavelength>1350</TargetWavelength>
  </SensorDefinitionCollection>
  <SensorDefinitionCollection>
    <StartingWavelength>1200</StartingWavelength>
    <StoppingWavelength>1300</StoppingWavelength>
    <TargetWavelength>1250</TargetWavelength>
  </SensorDefinitionCollection>
  <SensorRunner>
    <SensorConfig>
      <SampleCount>5</SampleCount>
      <SampleDelay>5</SampleDelay>
      <SampleTolerance>5</SampleTolerance>
    </SensorConfig>
  </SensorRunner>
</Session>

Но то, что я ожидаю получить, это:

<?xml version="1.0" encoding="utf-8"?>
<Session xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SensorDefinitionCollection>
    <SensorDefinition>
        <StartingWavelength>1200</StartingWavelength>
        <StoppingWavelength>1300</StoppingWavelength>
        <TargetWavelength>1250</TargetWavelength>
    </SensorDefinition>
  </SensorDefinitionCollection>
  <SensorRunner>
    <SensorConfig>
      <SampleCount>5</SampleCount>
      <SampleDelay>5</SampleDelay>
      <SampleTolerance>5</SampleTolerance>
    </SensorConfig>
  </SensorRunner>
</Session>

Как мне разрешить, чтобы список (SensorDefinitionCollection) стал единым элементом, и все SensorDefinitions в этом списке попадали внутрь?

UPDATE:

Проблема была решена с небольшим рефакторингом. Вместо того чтобы объект коллекции содержал список, этот объект наследует List с объектами определения.

    [XmlRoot("Session")]
    public class SensorSession
    {
        [XmlArray("SensorDefinitionCollection")]
        [XmlArrayItem("SensorDefinition")]
        public SensorDefinitionCollection Collection { get; set; }
        [XmlElement("SensorRunner")]
        public SensorRunner mRunner { set; get; }
    }

    [Serializable()]
    public class SensorDefinitionCollection : List<SensorDefinition>
    {
    }

    public class SensorDefinition : IEquatable<SensorDefinition>, IComparable<SensorDefinition>
    {
        [XmlElement("StartingWavelength")]
        public double startingWavelength { get; set; }
        [XmlElement("StoppingWavelength")]
        public double stoppingWavelength { get; set; }
        [XmlElement("TargetWavelength")]
        public double targetWavelength { get; set; }

    }

1 Ответ

0 голосов
/ 30 марта 2019

Это должно вам помочь,

[XmlRoot(ElementName = "SensorDefinition")]
public class SensorDefinition
{
    [XmlElement(ElementName = "StartingWavelength")]
    public int StartingWavelength { get; set; }
    [XmlElement(ElementName = "StoppingWavelength")]
    public int StoppingWavelength { get; set; }
    [XmlElement(ElementName = "TargetWavelength")]
    public int TargetWavelength { get; set; }
}

[XmlRoot(ElementName = "SensorDefinitionCollection")]
public class SensorDefinitionCollection
{
    [XmlElement(ElementName = "SensorDefinition")]
    public List<SensorDefinition> SensorDefinition { get; set; }
}

[XmlRoot(ElementName = "SensorConfig")]
public class SensorConfig
{
    [XmlElement(ElementName = "SampleCount")]
    public int SampleCount { get; set; }
    [XmlElement(ElementName = "SampleDelay")]
    public int SampleDelay { get; set; }
    [XmlElement(ElementName = "SampleTolerance")]
    public int SampleTolerance { get; set; }
}

[XmlRoot(ElementName = "SensorRunner")]
public class SensorRunner
{
    [XmlElement(ElementName = "SensorConfig")]
    public List<SensorConfig> SensorConfig { get; set; }
}

[XmlRoot(ElementName = "Session")]
public class SensorSession
{
    [XmlElement(ElementName = "SensorDefinitionCollection")]
    public List<SensorDefinitionCollection> SensorDefinitionCollection { get; set; }
    [XmlElement(ElementName = "SensorRunner")]
    public List<SensorRunner> SensorRunner { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...