Можно ли сериализовать массив, чтобы его элементы не были обернуты в тег для массива? - PullRequest
3 голосов
/ 27 декабря 2010

У меня есть следующие Rule и Ruleset классы:

[XmlInclude(typeof(OrRule))]
[XmlInclude(typeof(AndRule))]
[XmlInclude(typeof(EmptyRule))]
[XmlInclude(typeof(MatchRule))]
public class Rule {}

[XmlType("Or")]
public class OrRule
{
    public Rule[] Operands { get; set; }
}

[XmlType("And")]
public class AndRule
{
    public Rule[] Operands { get; set; }
}

[XmlType("Empty")]
public class EmptyRule {}

[XmlType("Match")]
public class MatchRule
{
    public string Regex { get; set; }
}

public class Ruleset
{
    public string Name { get; set; }

    [XmlArrayElement(typeof(OrRule))]
    [XmlArrayElement(typeof(AndRule))]
    [XmlArrayElement(typeof(EmptyRule))]
    [XmlArrayElement(typeof(MatchRule))]
    public Rule[] Rules { get; set; }
}

(Надеюсь, я все понял правильно - это радикально упрощенный пример, а не реальный код.) Они сериализуются примерно так:

<Ruleset Name="PasswordEmptyAllowed">
  <Rules>
    <Or>
      <Operands>
        <Empty />
        <And>
          <Operands>
            <Match Regex="\d" />
            <Match Regex="[a-záéíóöőúüű]" />              
            <Match Regex="[A-ZÁÉÍÓÖŐÚÜŰ]" />
          </Operands>
        </And>
      </Operands>
    </Or>
  </Rules>
</Ruleset>

Дополнительные теги <Rules> и <Operands>, на мой взгляд, довольно уродливы и ухудшают читабельность. Есть ли способ их устранить?

Как это:

<Ruleset Name="PasswordEmptyAllowed">
  <Or>
    <Empty />
    <And>
      <Match Regex="\d" />
      <Match Regex="[a-záéíóöőúüű]" />              
      <Match Regex="[A-ZÁÉÍÓÖŐÚÜŰ]" />
    </And>
  </Or>
</Ruleset>

Ответы [ 2 ]

3 голосов
/ 27 декабря 2010

Попробуйте это:

[XmlElement("Rule")]
public Rule[] Rules {
1 голос
/ 27 декабря 2010

Я думаю, вам придется манипулировать самим XML до / после его преобразования в Object / XML.

Но подумайте о том, что вы пытаетесь сделать.

Я бы хотелне согласен с вами по поводу того, что теги некрасивы.Я думаю, что они помогают в удобочитаемости, они держат дочерние теги вместе.

представьте тег с двумя такими коллекциями без тега переноса.При вашем подходе они могут быть легко смешаны вместе, что затруднит их чтение и сериализацию / десериализацию.

Пример:

<And>
  <Match Regex="\d" />
  <Replace From="123" To="ABC" />
  <Match Regex="[a-záéíóöőúüű]" />              
  <Replace From="_" To=" " />
  <Match Regex="[A-ZÁÉÍÓÖŐÚÜŰ]" />
  <Replace From="-" To="#" />
</And>

Вместо

<And>
  <Matches>
      <Match Regex="\d" />
      <Match Regex="[a-záéíóöőúüű]" />              
      <Match Regex="[A-ZÁÉÍÓÖŐÚÜŰ]" />
  </Matches>
  <Replaces>
      <Replace From="123" To="ABC" />      
      <Replace From="_" To=" " />
      <Replace From="-" To="#" />
  </Replaces>
</And>

Вы сами решаете, какой из них читаемый и обслуживаемый.

Подумайте, что может пойти не такпредложенный вами подход и почему XmlSerializer в .Net Framework способствует текущей реализации.

...